【问题标题】:fgets and sscanf getting list value twicefgets 和 sscanf 两次获取列表值
【发布时间】:2013-05-07 04:27:40
【问题描述】:

我在使用sscanffgets 时遇到问题,它似乎正在获取最后一个值输入并重新读取它,即使我们已经到了文件的末尾。我的代码:

while (won == 0) {
 char command, input[MAX_LENGTH];
 fgets(input, MAX_LENGTH, stdin);

 sscanf(input, " %c\n", &command);

 printf('%c\n', command);
 check_won();
}

【问题讨论】:

    标签: c fgets scanf


    【解决方案1】:

    您的sscanf 模式是%c %s,但您只阅读过command。这是故意的吗?您应该考虑检查fgets 的返回值以确保它实际上仍在读取输入,并检查sscanf 的返回值以确保它确实在读取两个元素(并丢弃第二个元素)。如果您的输入未正确解析和收集,并且您的 check_won 函数依赖于该输入,您将看到重复输入,因为您的数组不会被重新初始化。

    试试这样吧?

    if(fgets(input, MAX_LENGTH, stdin) == NULL) {
        break;
    }
    

    【讨论】:

    • 啊,不是要把 %s 留在里面。它不在我的代码中,我已经编辑了我的问题以反映这一点。
    • 同样的问题。您在 sscanf 中使用了带有文字的模式。如果输入之前没有前面的空格,sscanf 将不会读取 anything 并且command 仍将未初始化。试试"%c"
    • 哦,更简单。您没有检查fgets 是否读取任何内容。您需要在“if”语句中执行fgets,以确保它返回非空返回值(我刚刚复制了您的问题)。
    • 啊,我明白了!我是fgets 的新手,这是有道理的。谢谢:)
    【解决方案2】:

    在格式字符串中您指定了 2 个元素,但您只传递了一个参数 &command。

    sscanf(输入, " %c %s\n", &command);

    【讨论】:

      【解决方案3】:

      发生的情况是即使fgetsEOF 处失败,您的sscanf 正在读取input 的最后一个值,该值由fgets 获取。因此,如果fgets 失败,请不要执行 sscanf。

      试试这个

          char command, input[MAX_LENGTH];
      
          while ( won == 0 &&  fgets(input, MAX_LENGTH, stdin) ) {
           sscanf(input, " %c\n", &command);
           printf('%c\n', command);
           check_won();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 2014-04-15
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-13
        相关资源
        最近更新 更多