2011-06-22 64 views
5

这是一个基本的问题,但我似乎很困惑。fgets在内部如何工作?

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

基本上上面是我想达到的。 如果我输入一个字符串

James Bond 

那么我想,要存放在数组中。 但问题是因为存在一个空白空间,只有James字被存储。 那么我该如何解决这个问题。

UPDATE
)下面我明白与fgets(给出的答复后会是一个更好的选择。我想知道fgets的内部工作,为什么它能够将字符串存储在空间中,因为scanf无法做到这一点。

+3

使用'fgets'而不是'scanf'。几乎总是。 –

+0

@Chris Lutz我想知道fgets是如何工作的,为什么fgets能够接受空间而不是scanf? –

回答

5
+0

是的男人,正是我想要的。谢谢。让我知道你用什么关键字来获得这个。 –

+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

您应该使用gets(a)/ fgets(a,sizeof(a),stdin)而不是sscanf()。

+0

我想知道fgets的内部工作,为什么它能够将空间存储在字符串中,因为scanf无法做到这一点。 –

+0

@注册用户请参阅http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/。 %s为sscanf使用word。 (直到找到空格) – mattn

1

scanf读取直到第一个空白字符。解决的办法是用fgets,如果我没有记错正确的,在你的情况下它会是:

fgets(a, 100, STDIN);

它会读取多达从标准输入100个字符(或第一\ n)和存储它在一个。

即使看起来更容易,也不要使用gets函数。

+0

@Lainlwakura我想知道fgets是如何工作的,为什么fgets能够接受空间而不是scanf,为什么不应该使用gets()? –

+1

我不知道fgets()的内部结构,但不应该使用gets(),因为它只需要一个指向数组的指针。它完全不知道数组的大小,事实上你可以很容易地溢出它。一些编译器,比如gcc,实际上会警告你使用gets()函数 – LainIwakura

0

尝试fgets()

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

要了解更多关于STDINcheck this

+0

我想知道fgets是如何工作的,即fgets如何能够用空格存储整个字符串。 –

+0

@注册用户:请检查链接。 – Donotalo

+0

我读了你的链接,它谈到了stdin的文件描述符是0,但我无法得到fgets如何做。 –

1

通常scanf以空格(空格,制表符,换行符...)为输入进行分隔。

例如,输入" 5 42 -100"scanf("%d%d%d")接受,因为每个%d都会删除前导空格。 %s也会发生同样的情况。

唯一的转换符前导空格的其中忽略不发生是%%%[%c(以及,出于不同的原因,%n

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

,因为是fgets函数读取尽可能多的字符,直到巢线休息。


我用The Open Group Base Specifications Issue 7在线文档