Pregunta
Estoy tratando de implementar
void strcpyy(char *s, char *t){
while(*s++ = *t++){
}
}
que es un ejemplo de K&R.La implementación debería ser bastante sencilla pero, por alguna razón, ese no es mi caso en este momento.Entonces tengo lo siguiente
int main(){
char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
Cada vez que ejecuto el programa, sigo recibiendo una gran lista de errores cada vez que lo ejecuto. -Wall
.Yo pensaría que para implementar y utilizar strcpyy
, tendrías que asignar espacio para copiar la cadena y una vez que lo hagas, deberías poder imprimir aess
que teóricamente debería contener una copia de mess
.¡Cualquier ayuda sería muy apreciada!
Solución
Siempre es una buena práctica prestar atención a los mensajes de error, especialmente al primer mensaje (otros suelen ser consecuencias del primer error).El mensaje de error seguramente indicó el número de línea correspondiente a la línea con malloc, y muy probablemente le dijo cuál es el problema allí.
Corrija su programa para que lea:
char *mess = "hello world";
char *aess = (char *) malloc(strlen(mess) + 1);
o la función completa es:
int main(){
char *mess = "hello world";
char *aess = (char *) malloc(strlen(mess) + 1);
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
El problema es que tu línea
char *mess = (char *) malloc(strlen(mess) + 1);
sobrescribe la primera línea
char *mess = "hello world";
y la linea
char *aess;
deja la variable sin asignar.
El error de compilación se debe a que el compilador no puede elegir entre
char *mess = "hello world";
y
char *mess = (char *) malloc(strlen(mess) + 1);
los cuales introducen una nueva variable cada uno pero con el mismo nombre.
Otros consejos
El programa se verá de la siguiente manera
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strcpyy( char *s, const char *t )
{
while ( *s++ = *t++ );
}
int main( void )
{
char *t = "hello world";
char *s = ( char * )malloc( strlen( t ) + 1 );
strcpyy( s, t );
printf( "%s\n", s );
free( s );
return 0;
}
cambiar
char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;
a
char *mess = "hello world";
char *aess = malloc(strlen(mess) + 1);
mess
es un literal de cadena, que se mantiene en la memoria de solo lectura.lo estabas sobrescribiendo y perdiendo la cadena que querías copiar.necesitas asignar algo de espacio para el lugar donde deseas copiar los caracteres, en tu caso aess
variable.Además, recuerda free(aess);
al final de su programa.si no, tendrás pérdidas de memoria.
¿Por qué estás declarando y definiendo? mess
¿dos veces?nunca declares dos variables con el mismo nombre si tienen el mismo alcance, al hacer esto confundes al compilador;Recomiendo usar strdup
como esto :
int main(){
char *mess = strdup("hello world");
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}
o simplemente una matriz simple como esta
int main(){
char mess[] = "hello world";
char *aess;
strcpyy(aess, mess);
printf("%s", aess);
return 0;
}