0
#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 语句有什么影响。

4

3 回答 3

2

如果控制台看起来像这样:

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".

于 2012-12-11T20:26:06.470 回答
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<\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
于 2012-12-11T20:13:39.613 回答
0
scanf("%[^\n]s", msg);

这可能不是您想要的,您不需要s扫描集之后的。这样做你告诉scanf寻找一个s角色。

于 2012-12-11T20:18:13.947 回答