fgets内部如何运作?

时间:2011-06-22 07:26:18

标签: c gcc string

这是一个基本问题,但我似乎很困惑。

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

基本上上面就是我想要实现的目标。 如果我输入一个字符串

James Bond

然后我想将它存储在数组a中。 但问题是因为只存在James字之间存在空格。 那么我该如何解决这个问题。

更新
在下面给出的回复后,我理解fgets()将是更好的选择。我想知道fgets的内部工作,为什么它能够存储带有空格的字符串,而scanf也不能这样做。

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

scanf读取直到第一个空格字符。解决方案是使用fgets,如果内存正确地为我服务,在你的实例中它将是:

fgets(a, 100, STDIN);

它将从标准输入读取最多100个字符(或第一个\ n)并将其存储在a。

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

答案 2 :(得分: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进行在线记录

答案 3 :(得分:0)

你应该使用gets(a)/ fgets(an,sizeof(an),stdin)而不是scanf()。

答案 4 :(得分:0)

尝试fgets()

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

要详细了解STDINcheck this