scanf()函数是如何工作的?

4

在Windows系统中,

char c;
int i;

scanf("%d", &i);
scanf("%c", &c);

计算机会因为缓冲区中有'\n'而跳过从控制台检索字符。 但是,我发现下面的代码运行良好。
char str[10];
int i;

scanf("%d", &i);
scanf("%s", str);

就像上面的情况一样,'\n'仍然留在缓冲区中,但为什么这次scanf能够成功地从控制台获取字符串呢?

1
需要更多的输入。您在控制台中输入了什么?您想得到什么?上面的代码应该按预期工作,但这取决于预期的内容。 - Martin
2个回答

7

来自gcc手册(我手边没有Windows):

%c:总是匹配固定数量的字符。最大字段宽度表示要读取多少个字符;如果您没有指定最大值,则默认为1。它也不会跳过初始空格字符。

%s:匹配一串非空格字符。它跳过并丢弃初始空格,但在读取内容后遇到更多空格时停止。 [这个条款应该解释了你所看到的行为。]


2

有些难以理解这个问题,但scanf会忽略所有的空格字符。n是一个空格字符。如果你想检测用户何时按下回车键,你应该使用fgets。

fgets(str, 10, stdin);

不好意思我的英语不好:( 我想我应该使用“get”这个词而不是“retrieve”。我搞混了它们的意思。 - Jaebum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接