#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 语句有什么影响。
如果控制台看起来像这样:
123
abc
然后stdin
会有内容:123\nabc\n
在使用格式字符串scanf
调用之后,现在将是:。请注意,尚未消耗。"%d"
stdin
\nabc\n
\n
说明符%[^\n]
( thes
不应该在那里,它只会被视为一个额外的字符以在之后立即使用)意味着读取每个字符直到 a\n
\n
,所以由于在字符串的开头之前没有字符,因此不会存储任何内容进入缓冲区,stdin
并将保持为:\nabc\n
.
要解决此问题,请将第一个scanf
格式字符串更改为"%d\n"
,以便在读取数字\n
后将被消耗。由于%[^\n]
也不会使用\n
,您可能还想将该格式字符串更改为"%[^\n]\n"
.
只需将第一个 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<\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
scanf("%[^\n]s", msg);
这可能不是您想要的,您不需要s
扫描集之后的。这样做你告诉scanf
寻找一个s
角色。