C++ 由于缓冲区值-1导致无限循环?

C++ 由于缓冲区值-1导致无限循环?,c++,infinite-loop,cin,C++,Infinite Loop,Cin,我正在为课堂写这个程序。它应该容纳10个或更少字符的单词,并使用toupper()调用将每个字符单独更改为大写。赋值的要求是在包含单词和'\n'的数组中的每个字符上使用toupper()。这是我的密码: int main(int argc, char *argv[]) { char again = ' '; char word[11]; for(int count=0; count<11; count++){ word[count] =

我正在为课堂写这个程序。它应该容纳10个或更少字符的单词,并使用
toupper()
调用将每个字符单独更改为大写。赋值的要求是在包含单词和
'\n'
的数组中的每个字符上使用
toupper()
。这是我的密码:

int main(int argc, char *argv[])
{

    char again = ' ';
    char word[11];

    for(int count=0; count<11; count++){
            word[count] = ' ';
    }

    while(true){

        for(int clear=0; clear < 11; clear++){
            word[clear] = ' ';
        }

        system("CLS");
        cout << "Please provide a lowercase word!" << endl;
        cin.getline(word, 11);

        for(int letter = 0; letter < 11; letter++){
            system("CLS");
            if(letter < 10){
                word[letter] = toupper(word[letter]);
            }
            for(int printw = 0; printw < 11; printw++){
                cout << word[printw];
            }
            Sleep(200);
        }

        cout << endl;

        while(true){
            cout << "Would you like to Repeat or Quit? (R/Q)" << endl;
            cin.get(again);
            cin.get();

            tolower(again);

            if(again == 'r' || again == 'q'){
                break;
            }
            else{
                cout << "That was an invalide input!" << endl;
            }
        }

        if(again == 'q'){
            break;
        }
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}
intmain(intargc,char*argv[])
{
字符再次=“”;
字符字[11];

对于(int count=0;count而不是使用固定大小的字符数组,您应该使用
字符串来存储输入。您可以使用
getline
cin
读取一行,如下所示:

string input;
...
getline(cin, input);

这将读取整个行,不管它是多长时间或实际处理多少个字符。

你所看到的是代码< CIN的预期行为。GETLIN(CHAR*S,SRUSTSIZE N)<代码> BR/> < C++ > > <代码> ISREAM::GETLION<代码>:< /P> 如果函数未提取字符,则设置failbit标志;如果 一旦有(n-1)个字符,就找不到定界字符 已写入s

如果用户键入的单词长度超过10个字符,则cin将前10个字符写入
word
,并将其内部标志设置为失败,因为未看到分隔符
\n
(换行符)

如果您想坚持当前的解决方案,您可以通过以下方法克服此问题:

const int SIZE = 11;

您需要清除故障位并忽略剩余输入。256只是一个足够大的数字,为了超级安全,您可以使用
cin.ignore(numeric_limits::max(),'\n');
(不要忘了
#包括


PS您最好使用cin.get(char&c)一次读取一个字符虽然。

通常我会这样做,但类赋值要求我使用字符数组。除非你建议我将其读入字符串,然后创建一个字符数组,使其等于字符串的前10个字符?重要的是告诉OP,这将随着输入而增长,而他固定大小的11个字符数组显然不会,w超出其大小的RITE将导致未定义的行为,包括丢弃他的循环变量。@JosiahSaly赋值是否指定输入在一行上是否超过10个字符?如果不是,则您可能不需要担心。赋值没有指定输入的大小,只是指定数组的大小,我不想假设输入将匹配,因为我觉得这是一种不好的做法,我不希望她测试11或更大的字符串,这对我不利。这个程序中的循环太多了。你不需要嵌套的while(true)循环。您不需要printw循环,只需设置嵌套while循环,以防止用户输入r或q以外的内容,并让他们有机会决定如果他们输入其他内容而不是假设某一项或另一项,他们想做什么。有更好或更喜欢的方法来完成吗?谢谢但是,对于其余的部分,我不知道(是的,你可能被内在的东西卡住了。很高兴其他的观点有用)
cin.getline(word, SIZE);
if (cin.fail() && cin.gcount() == SIZE-1) { // failed because user entered a word longer than 10 chars
    word[SIZE-1] = '\0';    // make sure to null terminate
    cin.clear();            // clear the failure from cin
    cin.ignore(256, '\n');  // ignore the leftover input from cin until next newline
}