【问题标题】:Ending an interactive program causes infinite loop结束交互式程序会导致无限循环
【发布时间】:2012-02-12 06:23:57
【问题描述】:
//Testing numbers for primality

#include <iostream>
#include <cmath>
using namespace std;

int main() {

int n;          //User input number
int i;          //Input number will be divided by i
int count;      

count = 0;

cout << endl;   

while(n != 'q') {

    cout << "#: ";
    cin >> n;       

    for(i = 1; i <= n; i++) {   
                    //increase the divisor until it's equal to n                
        if(n % i == 0) {
             count++;
        }       
        //If there is no remainder, count increases by 1. Since prime numbers are only divisible by 1 and themselves, count will be exactly 2 in the case of a prime number.

    }

    if(count == 2) {
        cout << "   1\n";       //1 = yes prime

    }else if(count != 2) {      
        cout << "   0\n";       //0 = not prime

    }

    count = 0;

}

if(n == 'q') {
    return(0);
}
}

我在这里测试数字,看看它们是否是素数。每次除法 n/i 的余数为 0 时,计数都会增加,因此当 count=2 时,输出为 1 表示是,否则为 0 表示否。我已经让程序在会话期间正确地测试尽可能多的数字,但我正在尝试创建一个转义序列。

我尝试使用条件 (n=='q') 退出,但是当我输入 q 时,程序无限循环。我试着休息一下;在 while 循环中声明此条件,但结果是相同的。我猜这个问题与 char-int/int-char 转换有关。有人可以提示我如何创建有效的退出序列吗?

【问题讨论】:

标签: c++ while-loop


【解决方案1】:

您没有可以读取q 的代码。您的输入逻辑只接受一个数字。然后测试该数字是否等同于q 字符。字母 q 的等效整数是 113。如果您尝试这样做,它将退出。

由于您真的想输入一个数字一个字母,您需要编写可以接受其中任何一个的输入逻辑。然后你需要检查你得到了什么输入,然后进行相应的处理。

【讨论】:

  • 答案应该提到流状态,它是如何到达那里的,以及如何正确处理它。然后 'while(std::cin >> n){'
  • 呜呼老帖子碰撞!正如 Mooing Duck 提到的那样,您可以使用 cin &gt;&gt; inttype 尝试读取整数。如果它失败了,那就意味着缓冲区中有一些不是整数的东西。您需要先重置流,然后尝试从中读取字符串。这会成功,并且您可以将字符串与"q""quit" 或其他任何内容进行比较。
【解决方案2】:

'q' 是一个字符。 n 是一个整数。

检查n == 'q' 是否会将'q' 隐式转换为int 类型 - 因此,如果你输入数字 113('q' 的 ASCII 码),你的程序将退出。

您可能希望使用超出常规输入范围的数字(例如负值或零)作为终止条件。

旁注:在while 循环中检查之前,您没有初始化 nn 有可能从任何随机垃圾开始,因此在一定比例的时间内,您的程序将在完全不运行循环的情况下自发退出。你应该用-Wall -Wextra(如果使用gcc)编译你的代码,让编译器警告你这样明显的东西。

【讨论】:

  • 提示:带有流的无限循环意味着流处于错误状态。
  • @MooingDuck 什么?他只从cin 读入n,它的类型是int。存在“无限循环”的原因只是他有一个while 循环,他没有达到其终止条件(因为他误解了他正在检查的确切内容)。再看一下代码。
  • 在输入任何不是有效整数的内容时,他的代码将无限期地重复 n 的 previous(或未定义)值,因为 'std::cin' 将有它的badbit 设置并且不执行进一步的输入。
猜你喜欢
  • 2014-12-16
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2017-06-11
  • 2011-08-13
  • 2011-08-23
  • 1970-01-01
相关资源
最近更新 更多