[ Foro de C ]

Cadenas:strncpy

10-Jul-2006 12:11
Eladio San Romn Sevillano
10 Respuestas

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.



10-Jul-2006 19:29
Diego Teruel

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

11-Jul-2006 00:28
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.

11-Jul-2006 20:49
Arturo Lopez

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'...
12-Jul-2006 00:30
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

12-Jul-2006 19:54
Nacho Cabanes (+84)

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.


13-Jul-2006 01:08
Eladio San Romn Sevillano

Muchísimas gracias.
Efectivamente, ahora si que funciona.

Un cordial saludo... Eladio

13-Jul-2006 18:08
El oo

Nacho, pero como eres tan makina!
13-Jul-2006 22:03
Jose P. Jvega

Bueno Ñoño, por algo es el profe y se ha ido a Alemania a ver el mundial.......
14-Jul-2006 19:02
El oo

a ver l mundial no, xk no le gusta l futbol, pro weno, aunke sea el profe da=, maneja demasiado xD


18-Jul-2006 13:41
Nacho Cabanes (+84)

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...   diabólico






(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.)