【问题标题】:abnormal behavior of scanf [duplicate]scanf的异常行为[重复]
【发布时间】:2018-03-09 03:20:55
【问题描述】:

我有如下代码,它扫描一个矩阵,w - 矩阵的宽度,h - 矩阵的高度。

我正在使用 Visual Studio 2010。

每次我得到一个 char 时,它都会将 j 增加 2(我设置了断点并开始了解这种行为)。

int w = 0, h = 0;
char map[21][21];
int i,j;

scanf("%d%d", &w, &h);
for(i = 1; i <= h; ++i){
    for(j = 1; j <= w; ++j){
        //fflush(stdin);
        scanf("%c",&map[i][j]);
        //fflush(stdin);
    }
}

这背后的原因是什么?

在扫描时,我给出值,w = 7,h = 5。

我的代码中没有发现任何错误....请帮助我。

【问题讨论】:

  • fflush(stdin) 有未定义的行为,不要使用它!
  • 你用的是什么输入法?如果我给它7 5abcdefghijklmnopqrstuvwxyzABCDEFGHI 之类的东西(这似乎是预期的),它会按预期工作。也许您正在尝试读取某种不同格式的数据?
  • 感谢 fflush(stdin) 行为,我不知道。但仍然面临这个问题。
  • @P0W:如果您在 POSIX 派生系统上运行,fflush(stdin) 具有未定义的行为。如果您在 Windows 派生系统上运行,则该行为由 Mi​​crosoft 记录;它会丢弃输入缓冲区中已有的所有数据。
  • 数组索引从 0 开始,在 C 中。

标签: c scanf


【解决方案1】:

问题是由于scanf 留下的'\n' 字符(按 Enter )。
吃掉这些换行符的一种方法是在scanf 中的%c 之前放置一个' '

 scanf(" %c",&map[i][j]);  
        ^
        |
      space

另一种方法是使用循环通过getchar() 吃掉所有的\n

  int ch;
  while((ch=getchar())!='\n' && ch != EOF );

【讨论】:

  • 用户按回车多次即可;在%c 读取下一个非空白字符之前,格式中的空白会占用所有空格、制表符、换行符。
  • @JonathanLeffler;是的,你是对的。我想过通过getchar阅读。这就是为什么我弄错了。现已编辑。
【解决方案2】:

您需要跳过前一个 scanf 的尾随换行符

不要使用fflush(stdin)

用途:

int c;

while((c=getchar())!='\n' && c != EOF ); //eats newline came from scanf

scanf 通话后

【讨论】:

    【解决方案3】:

    这是vuppala srikar的答案。 他的问题“fscanf issue while reading input from text file [duplicate]”在我看来并不完全相同:

    在他的问题中,scanf 是在打开的文本文件 (fptr) 上完成的。

    而不是:

    while((fscanf(fptr,"%c %d",&c,&val))==2)
    {
        printf("%c %d\n",c,val);
    }
    

    我建议只读取文件的第一行:

    char line [50] ;
    while (fgets( line,sizeof( line ),fptr ))
        if (sscanf(line,"%c %d",&c,&val)==2)
            {
            printf("%c %d\n",c,val);
            }
    

    我希望我的答案不会太晚......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      相关资源
      最近更新 更多