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 成功地从控制台获取了字符串?

4

2 回答 2

7

从 gcc 手册页(我手边没有 Windows):

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

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

于 2010-01-18T12:07:23.427 回答
2

无法理解问题,但 scanf 会忽略所有空白字符。n是一个空白字符。如果你想检测用户何时按下回车,你应该使用 fgets。

fgets(str, 10, stdin);
于 2010-01-18T12:05:58.023 回答