C++ 陷入无限循环

C++ Stuck in infinite loop

本文关键字:无限循环 C++      更新时间:2023-10-16

好吧,伙计们,我是编程新手,需要一点帮助。我有一个程序,它接受输入的句子并显示单词和元音的数量。如果用户愿意,我想重复该程序,但是当我使用 do-while 循环时,in 会陷入无限循环。在我输入"Y"重复后,它会循环回来显示我为前一个句子输入的元音和单词数。

这是我的代码:

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    char sentence[50];
    int countA=0, countE=0, countI=0, countO=0, countU=0, countSP=0;
    char repeat;
    do {
    cout << "Enter sentence : ";
    cin.get(sentence, 50, 'n'); cin.ignore(10, 'n');

    cout << sentence;
    cout << "nThird character is : " << sentence[2];
    cout << "nLast character is : " << sentence[strlen(sentence)-1];
    cout << "nLength of sentence is : " << strlen(sentence);
    for(int x=0; x < strlen(sentence); x++) {
        char ch = tolower (sentence[x]);
        switch (ch) {
        case 'a':   countA++;break;
        case 'e':   countE++;break;
        case 'i':   countI++;break;
        case 'o':   countO++;break;
        case 'u':   countU++;break;
        case ' ':   countSP++;break;
        }
    }

    cout << "nNumber of A's : " << countA;
    cout << "nNumber of E's : " << countE;
    cout << "nNumber of I's : " << countI;
    cout << "nNumber of O's : " << countO;
    cout << "nNumber of U's : " << countU;
    cout << "nNumber of words : " << countSP+1;
    cout << "nnWould you like to enter a new sentence? (Y/N): ";
    cin >> repeat;
    }while (repeat == 'y' || repeat == 'Y');
    _getche();
    return 0;
}
表达式

(repeat == 'y' && repeat == 'Y') 将始终等于 false,因为repeat不能同时等于 'y' 'Y'

您可能的意思是:

(repeat == 'y' || repeat == 'Y');

尝试将 repeat == 'y' && repeat == 'Y' 替换为 repeat == 'y' || repeat == 'Y') ,因为代码中的条件永远不会为真。

(repeat == 'y' && repeat == 'Y');更改为(repeat == 'y' || repeat == 'Y');

编辑:您也没有大括号来打开或关闭您的环,请尝试此操作。

while (repeat == 'y' || repeat == 'Y')
   {
      _getche();
   }

因为循环没有主体,它不知道要执行什么。

编辑2 为什么不这样做?

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
     do while (repeat == 'y' || repeat == 'Y') {
     Enter()
     cout << "nnWould you like to enter a new sentence? (Y/N): ";
     cin >> repeat;
}
}
return 0;
Enter(){
    char sentence[50];
    int countA=0, countE=0, countI=0, countO=0, countU=0, countSP=0;
    char repeat = Y;
cout << "Enter sentence : ";
cin.get(sentence, 50, 'n'); cin.ignore(10, 'n');

cout << sentence;
cout << "nThird character is : " << sentence[2];
cout << "nLast character is : " << sentence[strlen(sentence)-1];
cout << "nLength of sentence is : " << strlen(sentence);
for(int x=0; x < strlen(sentence); x++) {
    char ch = tolower (sentence[x]);
    switch (ch) {
    case 'a':   countA++;break;
    case 'e':   countE++;break;
    case 'i':   countI++;break;
    case 'o':   countO++;break;
    case 'u':   countU++;break;
    case ' ':   countSP++;break;
    }

cout << "nNumber of A's : " << countA;
cout << "nNumber of E's : " << countE;
cout << "nNumber of I's : " << countI;
cout << "nNumber of O's : " << countO;
cout << "nNumber of U's : " << countU;
cout << "nNumber of words : " << countSP+1;
repeat = ' ';
}

要记住的主要事情是C++进行所谓的短路评估。如果 && 条件的一侧是假的,那么一切都是假的。举个例子,

int y = 1;
int x = 2;
if (y == 0 && x ==2) {
....
}

它只是要检查第一部分。由于 y = 1,它将返回一个假布尔值,并且此 if 语句将永远不会被执行。

像wise一样,使用or,||,如果条件的一侧为真,则条件将返回一个True Boolean,然后条件将被执行。

对于您的情况,正确的方法是:

(repeat == 'Y' || repeat == 'y');

这样,如果第一端为真,则将满足条件并执行。

您需要在

循环开始时将repeat设置为Yy以外的任何内容(例如:repeat = NULL;