Programación General > C/C++

 Modificando Una Cadena

<< < (2/3) > >>

desorden:
¿Cómo has inicializado la cadena?

Un saludo...

ToTeX:
En mi opinion la funcion esta correcta, la unica forma de generar un error en tiempo de ejecucion es pasarle un puntero no inicializado a la funcion modica.


#include <iostream>

using std::cout;
using std::endl;

char funcion(char c)
{
   return c+1;
}

void modifica(char* p)
{
   while(*p)
   {
      *p=funcion(*p);
      p++;
   }
}

int main()
{
   char* k,h[]="hola";
   cout<<h<<endl; //imprime 'hola'
   modifica(h);
   cout<<h<<endl; //imprime 'ipmb'
   modifica(k); //Error! k no es un puntero inicializado
}

desorden:

--- Cita de: "ToTeX" ---   modifica(k); //Error! k no es un puntero inicializado
--- Fin de la cita ---
Es un error porque no sabes que zona de memoria estás modificando, pero no provoca un error en ejecución.

Yo creo que el problema se encuentra en como se ha inicializado el puntero.

--- Código: Text --- #include &#60;stdio.h&#62; int main(void){   char cadena[] = &#34;hola&#34;;   char *puntero;    puntero = cadena;   printf(&#34;%c&#34;, *puntero);   (*puntero)++;   printf(&#34;%c&#34;, *puntero);   return 0;}  En cambio:

--- Código: Text --- #include &#60;stdio.h&#62; int main(void){   char *puntero = &#34;hola&#34;;    printf(&#34;%c&#34;, *puntero);   (*puntero)++;   printf(&#34;%c&#34;, *puntero);   return 0;}  Provoca el error. En este ejemplo, puntero apunta a una zona de memoria de solo lectura.

Un saludo...

shephiroth:
buenas. El problema es lógico que lo de en ejecucion, puesto que el puntero lo estas moviendo. Intenta ejecutar cambiando el modo en que recorres la cadena, me refiero

void modifica(char* p)
{
int x=0;
while(*(p+x)!='\0')
{
*(p+x)=funcion(*(p+x));
x++;
}
}


Asi te debería de funcionar, puesto que a la hora de volver al principal el puntero no lo has modificado, simplemente el contenido.

Suerte ^_^

P.D: Puedes utilizar p[x] en vez de *(p+x)

ToTeX:

--- Cita de: "desorden" ---
--- Cita de: "ToTeX" ---   modifica(k); //Error! k no es un puntero inicializado
--- Fin de la cita ---

Es un error porque no sabes que zona de memoria estás modificando, pero no provoca un error en ejecución.

Yo creo que el problema se encuentra en como se ha inicializado el puntero.
 
--- Fin de la cita ---
desorden no concuerdo contigo y no creo estar equivocado, segun entiendo hay errores en tiempo de compilacion(el codigo no se logra compilar por errores de sintaxis) y errores en tiempo de ejecucion, generalmente errores semanticos o logicos que provocan la finalizacion anormal del programa. El programa expuesto es sintacticamente correcto, compila bien, el problema ocurre solo cuando se le pasa un puntero que no esta incializado, o sea apunta a una zona de memoria desconocida como dices tu, pero eso es un error en tiempo de ejecucion.

shephiroth tampoco concuerdo contigo, creo que estas equivocado. Tu dices que perder el inicio del puntero en el ambito de la funcion void modifica(char* p) es el error, porque se modifica el puntero; ese es un grueso error porque el puntero se pasa por valor por lo tanto NO SE PUEDE MODIFICAR, el puntero con que se trabaja en el ambito de la funcion modifica es solo una copia del verdadero puntero,lo que se puede modificar es "lo que apunta el puntero", pero no el valor del puntero, por lo tanto no tiene sentido recorrer de esa forma que propones el arreglo.

Creo que ya concordamos todos en que el error se da cuando el puntero que pasa a la funcion no esta inicializado o apunta a una zona de memoria no modificable(como dijo desorden).

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa