2011-06-22 40 views
5

Bueno, es una pregunta básica, pero me parece bastante confuso.¿cómo funciona fgets internamente?

#include<stdio.h> 
int main() 
{ 
char a[100]; 
printf("Enter a string\n"); 
scanf("%s",a); 
} 

Básicamente lo anterior es lo que quiero lograr. Si entro en una cadena

James Bond 

entonces yo quiero que se almacenen en una matriz. Pero el problema se debe a la presencia de un espacio en blanco entre que solo se almacena la palabra James. Entonces, ¿cómo puedo solucionar este problema?

ACTUALIZACIÓN
Después de las respuestas dadas a continuación entiendo fgets() sería una mejor opción. Quiero saber el funcionamiento interno de los fgets, porque ¿por qué es capaz de almacenar la cadena con espacio, ya que scanf no puede hacer lo mismo?

+3

Use 'fgets' en lugar de' scanf'. Casi siempre. –

+0

@Chris Lutz. Quiero saber cómo funciona el error. ¿Por qué los fgets pueden aceptar espacio pero no escanear? –

Respuesta

5
+0

sí, hombre, eso es exactamente lo que quería. Gracias. Déjame saber qué palabras clave has usado para obtener eso. –

+0

http://www.google.ro/search?q=fgets+source+code&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a – Quamis

0

Debe usar gets (a)/fgets (a, sizeof (a), stdin) en lugar de sscanf().

+0

Quiero saber el funcionamiento interno de fgets, porque es capaz de almacenar la cadena con espacio, ya que scanf no puede hacer lo mismo. –

+0

@ usuario registrado, consulte http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/. % s para sscanf funciona con word. (hasta que se encuentre un espacio en blanco) – mattn

1

scanf se lee hasta el primer carácter de espacio en blanco. La solución es utilizar fgets, si la memoria no me falla, en su caso sería:

fgets(a, 100, STDIN);

Se leerá hasta 100 caracteres (o la primera \ n) a partir de la entrada estándar y almacenarlo en un.

No utilice la función get nunca, incluso si parece más fácil.

+0

@Lainlwakura Quiero saber cómo funciona el fgets. ¿Por qué los fgets pueden aceptar espacio pero no escanear y por qué no se debe usar gets()? –

+1

No conozco las partes internas de fgets(), pero no debe usar gets() porque solo toma un puntero a la matriz. No tiene absolutamente ningún conocimiento de cuán grande es el conjunto y de hecho puede desbordarlo muy fácilmente. Algunos compiladores, como gcc, en realidad te advertirán sobre el uso de la función gets() – LainIwakura

0

Trate fgets():

char a[100]; 
printf("Enter a string\n"); 
fgets(a, sizeof(a), STDIN); 

Para obtener más información sobre STDIN, check this.

+0

. Quiero saber cómo funciona el fgets, es decir, cómo es que los fgets pueden almacenar la cadena completa con espacio en blanco también. –

+0

@ Usuario Registrado: por favor revise el enlace. – Donotalo

+0

Leí su enlace habla sobre stdin cuyo descriptor de archivo es 0 pero no consigo saber cómo lo hace. –

1

Normalmente scanf interrumpe la entrada en el espacio en blanco (espacio, tabulación, nueva línea, ...).

Por ejemplo, la entrada " 5 42 -100" se acepta con scanf("%d%d%d") porque cada %d elimina el espacio en blanco inicial. El mismo comportamiento ocurre con %s.

Los únicos indicadores de conversión en el que haciendo caso omiso de los espacios en blanco, no sucede son %%, %[ y %c (y, por diferentes razones, %n)

char input[] = " hello world"; 
char buf[100]; 
sscanf(input, "%8c", buf); /* buf contains " hello w" */ 
sscanf(input, "%8[^o]", buf); /* buf contains " hell" */ 

La función fgets lee tantos caracteres, ya que hay hasta el descanso de la línea del nido.


utilizo The Open Group Base Specifications Issue 7 para la documentación en línea

Cuestiones relacionadas