【问题标题】:While loop with scan in C在C中进行扫描的while循环
【发布时间】:2013-02-13 12:31:46
【问题描述】:

所以我的问题如下。

int n=0;
while(n<=0)
    scanf("%d",&n);

这段代码进入了一个无限循环,我不知道为什么。当用户输入一个大于 0 的数字时,循环应该停止。

谢谢:)

【问题讨论】:

  • 代码可能永远不会进入循环 - 因为n 未初始化。你怎么知道它在循环?您是否输入了一个数字并按了 ENTER?
  • 我刚刚编译了这个,当我输入值 1 并回车时,它退出循环。我认为您的问题出在程序的其他地方。您可以尝试将n 设为volatile int,以确保您没有遇到优化问题。
  • 非常非常怀疑这个问题是由优化器引起的,volatile 不会修复它。
  • 好吧,我不知道什么是 volatile int,但我已经创建了一个新文件,只有这段代码可以单独尝试,仍然是同样的问题。

标签: c while-loop infinite-loop


【解决方案1】:

我认为你应该改变你的编译器,因为我得到了很好的结果。

您可能在其他地方遇到问题。

你可以在这里查看:

http://ideone.com/C4Yobi

代码:

#include<stdio.h>
main( )
{
int n = 0;
while (n <= 0)
    scanf("%d",&n);
printf("%d",n);
}

Input:
-5
4
Output:
4

【讨论】:

  • 好的,很抱歉给您带来麻烦,非常感谢。明天和老师谈谈,好像是gcc的问题。
  • 不太可能(实际上不可能)这是gcc 的问题。
  • @NikBougalis 我同意你的观点,因为我尝试使用相同的编译器。:)
  • 所以我真的不知道,也许我怎么称呼 gcc?我在 ubuntu 终端“gcc -o test1 test1.c”上执行以下命令
【解决方案2】:

既然你声称已经尝试过,但它们没有奏效(尽管我不明白为什么),让我们尝试一下其他方法。让我们使用程序员最好的朋友:printf。尝试运行此代码怎么样:

int n = 0;

while(n <= 0)
{
    printf("Please enter a number: ");
    scanf("%d\n", &n);
    printf("I see you entered: %d\n", n);
}

printf("Done with the loop. The value of n is: %d\n", n);

这将让您看到计算机正在做什么以及它在读取它们时读取的值。尝试用上面的代码替换你的代码,看看会发生什么。

【讨论】:

  • 现在它在我第二次输入后停止,这更好。
  • 请输入一个数字:5 2 我看到你输入了:5 循环完成。 n的值为:5
  • 对。所以它工作正常。您输入了 5,它显示为 5,并且 正确 退出了循环,因为 5 不是零且为正数。那么有什么问题呢?
  • 我必须输入 2,所以它退出了循环。
  • 你输入5后回车了吗?
【解决方案3】:
while (n <= 0)
    // something

表示“在n 的值小于或等于0 时做某事”。只需确保在评估条件n &lt;= 0 时初始化n。使用未初始化的变量会产生未定义的行为

你应该这样做:

int n = 0;
while (n <= 0)
    scanf("%d\n",&n);

【讨论】:

  • 是的,我知道,所以当扫描得到 n>10 时,它应该停止吧?
  • @user2116077 应该,当然 - 看我的回答。
【解决方案4】:

一遍又一遍……

stdin(通常)是行缓冲的 - 必须按 &lt;enter&gt; 才能使终端将字符传输到您的程序。所以现在缓冲区中有一个悬空的换行符,scanf() 将在下一次迭代期间尝试读取它,但它不是整数,所以它失败并且不会更改变量的内容。为了解决这个问题,让scanf()吃掉换行符:

scanf("%d\n", &number);

(哦,是的,n 也未初始化使用,但您的代码似乎无论如何都进入了循环,所以这不是问题。请初始化它,,否则你 面临其他奇怪的错误。)

【讨论】:

  • @user2116077 从这个答案的质量推断(对不起,但是......) - 您的代码中可能有其他问题/语义错误/未定义的行为。也检查一下。
  • @H2CO3 在 c++ 中是 UB,但在 c 的情况下是这样吗?
  • 你已经尝试了什么?键入一个数字并按 ENTER?吃新线?你没有帮助我们帮助你......
  • 这是我的第一篇文章,如果我没有帮助,我有点困惑抱歉 xD 我已经尝试输入并按 Enter,是的。
  • 我的意思是这个程序会像 c++ 一样导致 ub。
猜你喜欢
  • 2014-03-28
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2023-01-08
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多