#include <stdio.h>
int main()
{
int a;
char msg[10];
scanf("%d",&a);
printf("%d\n",a);
scanf("%[^\n]s",msg);
printf("%s\n",msg);
return 0;
}
程序正在接受整数值并打印它,但第二个scanf()
调用不接受任何内容。这是为什么?
^ \ n对上下文中的scanf语句有什么影响。
答案 0 :(得分:2)
如果控制台看起来像这样:
123
abc
然后stdin
将包含以下内容:123\nabc\n
使用scanf
格式字符串进行"%d"
通话后,stdin
现在将为:\nabc\n
。请注意,\n
尚未消耗。
说明符%[^\n]
(s
不应该在那里,只是被视为一个额外的字符后立即消费)意味着读取每个字符,直到{{1 } ,因为在字符串开头的\n
之前没有字符,所以不会将任何字符存储到缓冲区中,\n
将保留为:stdin
。
要解决此问题,请将第一个\nabc\n
格式字符串更改为scanf
,以便在读取数字后将使用"%d\n"
。由于\n
也不会使用%[^\n]
,因此您可能还希望将该格式字符串更改为\n
。
答案 1 :(得分:0)
只需将第一个scanf更改为:
scanf("%d\n",&a);
否则第二个scanf只看到\ n并读取0个项目(从而使你的msg保持不变。
使用原始代码和一些添加的诊断程序:
#include <stdio.h>
#include <string.h>
int main() {
int a;
int itemsScanned;
char msg[10]; strcpy (msg, "unchanged");
itemsScanned=scanf("%d",&a);
printf("itemsScanned=%d a=%d\n",itemsScanned, a);
itemsScanned=scanf("%[^\n]s",msg);
printf("itemsScanned=%d msg=%s\n",itemsScanned, msg);
return 0;
}
输出(当输入3&lt; \ nl时)是:
> ./a.out
3
itemsScanned=1 a=3
itemsScanned=0 msg=unchanged
在第一个scanf中添加\ n,然后输入5 \ nlHugo \ nl:
./a.out
5
Hugo
itemsScanned=1 a=5
itemsScanned=1 msg=Hugo
答案 2 :(得分:0)
scanf("%[^\n]s", msg);
这可能不是你想要的,你不需要扫描集之后的s
。这样做,您告诉scanf
寻找s
个字符。