scanf with ^ operator

时间:2012-12-11 20:10:39

标签: c scanf

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

3 个答案:

答案 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个字符。