为什么c++中的while循环无法正确运行

Why my while loop in c++ wont run correctly?

本文关键字:运行 循环 c++ 中的 while 为什么      更新时间:2023-10-16

我只是一个编程新手,我试图编写一个while循环,只要输入(num)不是以零结尾的整数,它就会运行。当我输入一个以零结尾的数字时,程序会正确地运行循环,但当我输入一些无意义的东西,如rofl时,程序只打印The input is not valid.,不会重复循环。我试着寻找解决方案,但一个小时后我还是被卡住了。有人能帮我吗?太多了!

void rev_sum() {
    int num;
    int a = 1;
    while (a < 2) {
        cout << "Please input a natural number without zero at the end:n";
        cin >> num;
        if (!cin) {
            cout << "The input is not valid.n";
            cin.clear();
            cin.ignore(INT_MAX);
        }
        if (num % 10 == 0) {
            cout << "The number cannot have zero at the endn";
        } else {
            cout << "gjn";
            break;
        }
    }
}

尝试更换

cin.ignore(INT_MAX);

cin.ignore(numeric_limits<streamsize>::max(), 'n');

并更改

if (num % 10 == 0)

else if (num % 10 == 0)

您的最终代码应该是这样的:

void rev_sum() {
    int num;
    int a = 1;
    while (a < 2) {
        cout << "Please input a natural number without zero at the end:n";
        cin >> num;
        if (!cin) {
            cout << "The input is not valid.n";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), 'n');
        }
        else if (num % 10 == 0) {
            cout << "The number cannot have zero at the endn";
        } else {
            cout << "gjn";
            break;
        }
    }
}
if (num % 10 == 0) {

可能是

else if (num % 10 == 0) {

否则,其他情况可能会被执行

在循环开始时设置a = 1,然后从不更改a,这意味着离开while循环的唯一方法是命中break语句。如果你的循环没有循环,那么它一定被卡住了。我不熟悉if (!cin)cin.ignore(...)这两个语句,所以它们是需要检查(或更改)的首要问题。语句cin >> num;无论键入什么都会完成,因此当您输入"rofl"时,您可以检查"num"等于什么。然后在它失败后,您仍然使用num,所以您正在处理这个无意的条目。您可以在cin.ignore(...)之后添加continue;,跳回while循环的顶部并再次提问。你也可以在while循环后打印一些东西,以便知道你什么时候出来。

尽管如此,我永远不会相信用户会输入可接受的信息,也永远不会相信cin会为我处理它。就我个人而言,我会使用cin.getline(buffer,buffer_size)将cin读取为字符串;然后我会向用户抱怨,如果他们填充了缓冲区,或者给了我一些不是整数的东西(你可以用scanf()这样的函数来检查)。然后你可以准确地吐出他们给你的东西,你可以具体地说出你的投诉。

如果输入有效,只检查数字是否以0结尾是否更有意义。。。。

void rev_sum() {
    int num;
    int a = 1;
    while (a < 2) {
        cout << "Please input a natural number without zero at the end:n";
        cin >> num;
        if (!cin) {
            cout << "The input is not valid.n";
            cin.clear();
            cin.ignore(INT_MAX);
        } else {
            if (num % 10 == 0) {
                cout << "The number cannot have zero at the endn";
            } else {
                cout << "gjn";
                break;
            }
        }
    }
}
cin.ignore(numeric_limits<streamsize>::max())