elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Entrada de datos con fgets()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Entrada de datos con fgets()  (Leído 2,789 veces)
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Entrada de datos con fgets()
« en: 2 Abril 2014, 18:23 pm »

Imaginemos que tenemos un un array como:

   char cadena[10];

Entonces usamos la función fgets para leer una cadena de caracteres como:

   fgets(cadena, 10, stdin);

E introducimos menos de 9 caracteres por lo que automáticamente se nos pone un '\n' al final del array, en la posición cadena[9] en el ejemplo.
Entonces si usamos:

   if(cadena[strlen(cadena)-1] == '\n'{
      cadena[strlen(cadena)-1] = '\0'
   }

obtenemos la cadena sin la impresión de una nueva línea (es decir que el cursor se situa justo después del último caracter.

Lo que no entiendo de todo es es que si introducimos por ejemplo HOLA el array quedaría como:

   H O L A  \0 _ _ _ _ \n

y al usar la anterior instrucción para quitar el '\n' tendríamos:
   
   H O L A  \0 _ _ _ _ \0

¿Cómo es posible tener dos '\0'?

Muchas gracias.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Entrada de datos con fgets()
« Respuesta #1 en: 2 Abril 2014, 19:44 pm »

El detalle es: los caracteres '\n' y '\0' no se almacenan en las ultimas posiciones del array sino justo después del texto ingresado. Siguiendo tu ejemplo al introducir "Hola" los caracteres en el array son:
Código:
0  1  2  3  4  5  6  7  8  9
H  o  l  a \n \0
A continuación strlen te devuelve el numero de caracteres sin contar el '\0', en este caso son cinco y la asignación sobrescribe el carácter '\n' con un '\0' resultando en:
Código:
0  1  2  3  4  5  6  7  8  9
H  o  l  a \0 \0
Con ello el primer '\0' marca el final de la cadena.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
noele1995

Desconectado Desconectado

Mensajes: 137



Ver Perfil
Re: Entrada de datos con fgets()
« Respuesta #2 en: 2 Abril 2014, 20:33 pm »

¿Cómo es posible tener dos '\0'?

Un array de tipo char en realidad no es mas que un array de bytes, pero para el uso de cadenas de texto el primer \0 es lo que marca el final de la cadena, no influye en que en otra posicion del array haya otro.
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Entrada de datos con fgets()
« Respuesta #3 en: 2 Abril 2014, 20:57 pm »

No es que la cadena posea dos '\0', pues sólo el primero cuenta. Para poner un ejemplo imagínate que tienes:

'h' 'o' 'l' 'a' '\0' '\0' '\0' '\0' '\0'

entonces el primer '\0' encontrado marca el fin de la cadena, que es "hola" y su longitud es 4.

En el ejemplo que dices, si conviertes

'h' 'o' 'l' 'a' '\n' '\0'

en

'h' 'o' 'l' 'a' '\0' '\0'

entonces haces una cadena "más corta", y pasa de tener 5 caracteres a tener 4.

==========================
EDITO

Sólo por comentar, aunque no se si me estoy extendiendo en el tema. El código que propones se puede optimizar eliminando la sobrecarga por llamar dos veces a la función strlen() (aunque un usuario me dijo que los compiladores modernos saben cómo evitar este problema). Una manera es por supuesto depositar el valor de la longitud de la cadena en una variable intermedia:
Código
  1. int len = strlen(cadena);
  2. if(cadena[len-1] == '\n'{
  3.   cadena[len-1] = '\0'
  4. }
O incluso otra forma "autoconstruida", donde no se llama a ninguna función de biblioteca:
Código
  1. for ( i = 0; cadena[i] != '\0'; i++ )
  2.   if ( cadena[i] == '\n' ) cadena[i] = '\0';
o:
Código
  1. char c;
  2. int i = 0;
  3. while ( (c = cadena[i]) != '\n' && c != '\0' )
  4.   i++;
  5. if ( c == '\n' ) cadena[i] = '\0';
  6.  
« Última modificación: 2 Abril 2014, 21:12 pm por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
David8

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Entrada de datos con fgets()
« Respuesta #4 en: 3 Abril 2014, 19:43 pm »

Muchas gracias a todos, se resolvió notablemente mi duda  :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Tantos datos y no consigo entrada....
Nivel Web
cho 2 3,363 Último mensaje 28 Diciembre 2010, 21:05 pm
por hdbreaker
duda con n entrada de datos...
Java
rub'n 4 5,435 Último mensaje 31 Octubre 2010, 23:24 pm
por rub'n
Entrada y Salida de datos C++
Programación C/C++
prometheus48 6 4,201 Último mensaje 5 Enero 2012, 02:13 am
por rir3760
Captura de entrada de datos
.NET (C#, VB.NET, ASP)
korsakof 2 2,174 Último mensaje 22 Febrero 2014, 19:25 pm
por Yaldabaot
Escribir en la entrada de datos de un programa desde c
Programación C/C++
4dr14n31t0r 3 2,265 Último mensaje 20 Noviembre 2016, 01:39 am
por Drewermerc
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines