C/Visual C - ayuuuuuudaaa!!!! =(

 
Vista:

ayuuuuuudaaa!!!! =(

Publicado por martin (1 intervención) el 18/04/2005 18:58:08
Hola todos, de antemano les mando un cordial saludo, y espero me puedan ayudar con esta duda que tengo...

El problema es este, voy a explicar primero la parte de codigo de codigo que si me sale y despues voy a explicar, la que no me sale, ojala me puedan entender:

---------------
char *frace, txt;
register int tamano;
register int t;
frace ="hola a toda" ;
tamano = strlen (frace)-1;

for (t=0; t < tamano ; t++)
{
printf ("%c", frace[tamano]);
}
printf("\n\n\n\n");
//La salida de este programa es hola a todos, pero cuando quiero pedir la cadena (la de la frace) en la salida me arroja pura basura

-----------
char *frace, txt;
register int tamano;
register int t;
printf("dame la frace\n");
scanf("%s", &txt);
frace = &txt;
tamano = strlen (frace)-1;
t=0;

for (t=0; t < tamano ; t++)
{
printf ("%c", frace[tamano]);
send(soquete,frace,frace[tamano],0);
}
printf("\n\n\n\n");

//en este codigo que es el que me importa, y necesito, cuando pido la cadena arroja pura basura, ¿ alguien me puede decir por que pasa eso?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ayuuuuuudaaa!!!! =(

Publicado por fernando.gomez (1603 intervenciones) el 18/04/2005 22:38:39
Mmm... el problema es común en el manejo de cadenas... El problema es que txt y frase apuntan a basura en la memoria. Cuando se ejecuta la sentencia:
frase ="hola a todos" ;
en tu primer ejemplo, el compilador asigna un espacio en memoria de 13 bytes para los caracteres, y acto seguido asigna la dirección de memoria del primer caracter a "frase". Pero en tu segundo ejemplo, no la inicializas a algo, y por ello sólo muestra basura (en alguna ocasión hasta te podría lanzar una excepción de memoria inválida).

Para solventar el problema, necesitas reservar espacio en memoria, estáticamente o dinámicamente, como quieras. Supongamos que asignamos un búfer de 20 bytes para 19 caracteres. Entonces:

// estáticamente
char txt[20];

o bien

/* para C ejecutas esta sentencia */
char* txt = malloc(20);
// en C++ también puedes ejecutar esta sentencia
char* txt = new char[20];

Con eso ya no deberías tener problemas. Por cierto, la sentencia:
frase = &txt%3
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ayuuuuuudaaa!!!! =(

Publicado por fernando.gomez (1603 intervenciones) el 18/04/2005 22:40:29
Con eso ya no deberías tener problemas. Por cierto, la sentencia:
frase = &txt;
me parece incorrecta, porque asignarías la dirección de memoria del puntero a caracter, con lo que frase debería ser declarada como:
char** frase;

Finalmente, no te olvides de liberar el espacio en memoria que usaste si creaste tu búfer dinámicamente:

/* esta sentencia si llamasta a malloc */
free(txt);
/* esta sentencia si llamaste al operador new */
delete [] txt;

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar