[ Foro de C ]
Cadenas:strncpy
Eladio San Romn Sevillano
En el ejemplo nº 44, la salida; ademas de las cuatro primeras letras aparecen signos raros, creo que hasta completar los nueve que puede admitir.
Compilo con: Dev-C++, ¿puede ser un problema del compilador?
Muchas gracias de antemano.
No creo estar muy seguro, pero diria que no es problema del compilador, si no que los signos que te aparecen es basura que te queda en la cadena. Si no recuerdo mal(que creo que no) los simbolos raros aparecian por algo de la posicion de memoria que ocupaban o algo asi.
Bueno, mejor que te lo explique Nacho, que yo estoy que no me acuerdo de nada.
Saludos
Eladio San Romn Sevillano
Gracias Diego, yo también pense eso. Pero despues de releer el tema, creí entender que strncpy se utiliza precisamente para que solo salgan los caracteres que se decida.
Un saludo... Eladio.
Precisamente, con strncpy indicas cuanto quieres leer, pero prueba con strcpy que es mas sencillo y probablemente te evites esos caracteres, en todo caso, si quieres leer de mas, siempre puedes, despues de leer, borrar el contenido de los caracteres que van a leer 'basura'...
Eladio San Romn Sevillano
Mi duda surgió al compilar uno de los ejercicios. Precisamente el relacionado con "strncpy". El resultado no fué el que esperaba. Aparecieron, además de los caracteres esperados, una serie de símbolos.
Al releer el tema me reafirmé en la idea de que "strncpy" se utilizaba para limitar o fijar el nº de caracteres deseados.
Quizás no lo entendí bién. Volveré a mirarlo.
En el Manual lo referido a strncpy es lo siguiente:
"
Es nuestra responsabilidad que en la cadena de destino haya suficiente
espacio reservado para copiar lo que queremos. Si no es así, estaremos
sobreescribiendo direcciones de memoria en las que no sabemos qué hay.Para
evitar este problema, tenemos una forma de indicar que queremos copiar
sólo los primeros n bytes de origen, usando la función “strncpyâ€, así: strncpy (destino, origen, n);Vamos a ver un ejemplo, que nos pida que tecleemos una frase y guarde en otra variable sólo las 4 primeras letras:"
Muchas gracias, Arturo.
Un saludo... Eladio
Me imagino cual es el problema que tienes: "strncpy" copia varios caracteres, pero NO el carácter nulo de final de la cadena inicial.
Como todas las funciones de manejo de cadenas, entre ellas "printf", se apoyan en que la cadena va a terminar en carácter nulo, muestran (o manipulan) todos los caracteres hasta ese caracter nulo... que "strncpy" NO ha puesto.
Con un ejemplo se verá mejor
Cadena origen inicial: JUAN (realmente, JUAN\0)
Cadena destino inicial: hola123 (realmente, hola123\0)
Si le digo que copie las 3 primeras letras de "JUAN\0" en "hola123\0", el resultado no es "JUA\0", porque "strncpy" no añade el carácter nulo, sino "JUAa123\0", y eso es lo que mostraría la orden "printf".
(si tienes basura en vez de tener algo tan "vistoso" como "hola123", lo que se verá será basura).
¿Cómo evitarlo? Asegurándote de que termine con un carácter nulo, así:
texto3[4]='\0';
El fuente quedaría así:
char texto1[40], texto2[40], texto3[10];
main()
{
printf("Introduce un frase: ");
gets(texto1);
strcpy(texto2, texto1);
printf("Una copia de tu texto es %s\n", texto2);
strncpy(texto3, texto1, 4);
texto3[4]='\0';
printf("Y sus 4 primeras letras son %s\n", texto3);
}
Un saludo,
N.
Eladio San Romn Sevillano
Muchísimas gracias.
Efectivamente, ahora si que funciona.
Un cordial saludo... Eladio
Nacho, pero como eres tan makina!
Bueno Ñoño, por algo es el profe y se ha ido a Alemania a ver el mundial.......
a ver l mundial no, xk no le gusta l futbol, pro weno, aunke sea el profe da=, maneja demasiado xD
A ver el mundial? Yo? Pero si estuve al lado del Brasil-Japón y no me molesté en intentar entrar a verlo... ;-)
Eso sí, he cogido muchas ideas. En Alemania, son los alumnos los que buscan las empresas en las que van a hacer prácticas, y hasta que no encuentran una empresa que les acepte, no pueden matricularse en FP. Habrá que tomar medidas similares para que la gente ponga más interés...
(No se puede continuar esta discusión
porque tiene más de dos meses de antigüedad.
Si tienes dudas parecidas, abre un nuevo hilo.)