【问题标题】:scanf inside while loop working only one timescanf 在 while 循环内只工作一次
【发布时间】:2013-05-03 02:26:19
【问题描述】:

所以我有这段代码,它应该从用户那里获取坐标:

#include <stdio.h>
#include <time.h>

int main() {
int number;
char letter;
int points = 3;
    while(points < 8){
        printf("give me first coordinate (letter)");
        scanf("%c",&letter);
        printf("give me second coordinate (number)");
        scanf("%d",&number);
    }
}

据我所知,这应该继续从用户那里获取坐标,但它只获取一次,然后以一种非常奇怪的方式粉碎,就像它无缘无故地跳过 scanf 一样。这是我的输出:

give me first coordinate (letter)a
give me second coordinate (number)1
give me first coordinate (letter)give me second coordinate (number)12
give me first coordinate (letter)give me second coordinate (number)df
give me first coordinate (letter)give me second coordinate (number)give me first coordinate (letter)give me second coordinate (number)sss

我感到很困惑,因为这是简单的代码,我不知道是什么原因造成的。有人吗?(如果有什么不同,我的系统是山狮)

【问题讨论】:

  • 想想你是如何处理输入中出现的换行符的。提示:你现在根本没有处理它们。
  • 您忽略了输入操作的结果。这是一个致命的编程错误。
  • @KubaPolaczek 错误是人人都会犯的……但是你以后如何避免犯这个错误呢?在我看来,这个问题主要是关于scanf。我会从仔细阅读scanf 手册开始,一遍又一遍,直到我完全理解为止……为了将来参考,opengroup 对 C 标准库函数进行了很好的描述。您可以通过谷歌搜索“opengroup scanf”找到 opengroup scanf 手册。

标签: c while-loop scanf


【解决方案1】:
scanf(" %c",&ch);

这样做的原因是第一个空格会刷新标准输入,然后让用户输入字符。

如果您将/n/t 放在%c 之前,这也有效

【讨论】:

    【解决方案2】:

    一种可能的解决方案是添加一个空格来跳过空格:

    scanf(" %c",&letter);
           ^
    

    正如用户正确指出的“未定义行为”,您还应该检查返回值。在这种情况下,您希望返回值等于您正在阅读的项目数,如果返回值 &lt;0 那么您无法再从 stdin 读取并且返回值小于您的项目数读入表明你有一个转换错误。

    【讨论】:

    • 确保检查返回值。负值表示无法再读取stdin,任何小于预期读取的项目数(在本例中为 1)的返回值表示发生了转换错误(例如,由@VX 下面:“如果您在 scanf("%d",&i) 中输入“a”,您将永远不会得到任何结果...")
    【解决方案3】:

    我个人不喜欢 scanf 的用法。此函数使输入流处于不像看起来那样定义良好的状态。 我更喜欢 fgets 结合 sscanf...

    【讨论】:

    • 如果用对了就没有问题。
    猜你喜欢
    • 2017-03-02
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多