c - 再次打印上次呼叫功能

时间:2016-10-03 01:39:50

标签: c loops printing while-loop

这是我调用patternsearch函数的a4.c main方法中的循环:

while(!feof(stdin)) {
scanf("%s", &word); 
patternSearch(grid, word); 
}

由于某些我无法弄清楚的原因,这会打印出对patternsearch的最后一次调用两次:

例如,查看test3的输出:

Found "tip" at 0 2, L
Found "pop" at 0 0, D
Found "pop" at 2 0, U
Found "key" at 0 3, D
Found "key" at 2 1, R
"nope" - Not Found
"nope" - Not Found

正如您所看到的,“nope'”的测试结果被打印了两次。 :(

我认为我的问题类似于此处所说的问题: Last line being printed twice (C++) 但我不确定。

2 个答案:

答案 0 :(得分:1)

第1步涉及任何涉及输入的问题:测试输入函数的返回值

  1. feof()检查之前的读取是否导致文件结束。它没有报告未来的阅读。

  2. 代码在scanf("%s", &word);的意外结果出现问题,但代码未检查scanf()的返回值。弱代码不检查返回值。强大的代码。研究正确使用scanf()及其返回值。

  3. 请勿在没有宽度限制的情况下使用"%s"

  4. 可能不需要&中的scanf("%s", &word);。需要查看word声明才能确定。

    char word[100];
    while (scanf("%99s", word) == 1) {
      patternSearch(grid, word); 
    }
    

答案 1 :(得分:0)

这里的问题是,当我真正击中EOF角色时,feof()只返回true 这意味着我正在调用scanf(),然后点击EOF; 这意味着循环不会再次迭代,但我已经处于中间位置 但是scanf()实际上只是改变了我提出的参数,如果它成功读出了我的要求; 因为它失败了(通过击中EOF), 它不会改变字符数组,它仍然包含它之前做的任何事情(即前一个字)。

我检查了scanf()的返回值;它返回的数字,它是一个新值的参数数量; 如果它小于1,那么我实际上并没有得到一个新的字符串(我认为如果它到达文件结尾,它也明确地返回EOF; EOF是一个#defined常量,'在大多数平台上s等于-1,因此< 1检查无论如何都会起作用。“

这是最终有效的代码:

while(!feof(stdin)) {
    if (scanf("%s", &word) < 1)
      break;
    patternSearch(grid, word);
  }