循环不正常

时间:2013-04-25 01:30:31

标签: c++ loops robot

我正在制作一个名叫吉尔伯特的机器人,他充满了愚蠢。到目前为止。

http://pastecode.org/index.php/view/36572371

让我们说他回答了一个问题,然后会说

“问别人?(是/否)”

如果我说Y,它会说

“问别人?(是/否)”

一次。说Y再问你一次。我该如何解决?

//  Created by Brad Gainsburg on 4/23/13.
//  Copyright (c) 2013 Ostrich. All rights reserved.

#include <iostream>
#include <string>

using namespace std;

int main(int argc, const char* argv[]) {
    cout << "   _____ _ _ _              _   " << endl;
    cout << " / ____(_) | |             | |  " << endl;
    cout << "| |  __ _| | |__   ___ _ __| |_ " << endl;
    cout << "| | |_ | | | '_ \\ / _ \\ '__| __|" << endl;
    cout << "| |__| | | | |_) |  __/ |  | |_ " << endl;
    cout << " \\_____|_|_|_.__/ \\___|_|   \\__|" << endl;
    //Ask Question
    char loop;
    do {
        string sentence;
        string search;
        size_t pos;
        int count;

        cout << "Ask Gilbert a question:" << endl;
        getline(cin, sentence);

        //Words    
        count = 0;
        search = "apple";
        pos = sentence.find(search);
        if (pos != string::npos && count == 0) {
            cout << "i likez thouse.";
            ++count;
        }

        count = 0;
        search = "pear";
        pos = sentence.find(search);
        if (pos != string::npos && count == 0) {
            cout << "i likez thou.";
            ++count;
        }

        //End Loop
        cout << endl << "Ask another?(Y/N)" << endl;
        cin >> loop;
        cout << string(3, '\n');
    } while (loop == 'y' || loop == 'Y');
    if (loop == 'n') {
        cout << "i didnt like you anyways...";
        return 0;

    }
}

2 个答案:

答案 0 :(得分:6)

问题出在以下声明中:

cin >> loop;

当用户输入一个字母时,例如'y'并按Enter键。它实际上会在输入缓冲区'y''\n'中存储两个字符。字符'y'存储在loop中,但'\n'仍然存在。因此,当在do-while循环内部时,它到达此行:

getline (cin, sentence);

由于缓冲区中已有\n个字符,getline将接受它,并且不会要求用户输入更多字符。因此,您看到了奇怪的提示输出。

尝试以下方法:

cin >> loop;
cin.ignore();

它应该按照您的预期进行上述更改。

答案 1 :(得分:0)

你的代码的问题在于你是第一次读取whit getline(cin,sentence),这个函数读取当前行,直到找到第一行结束,但是当你用cin&gt;&gt;读取时循环,然后在到达可打印字符时读取cin,因此不会消耗新行字符,并且在下一次循环getline中的迭代消耗此新行字符('\ n')。

为了解决这个问题,另一个解决方案是你可以用getline读取一个字符串并将其第一个字符分配给变量循环。

//End Loop
cout << endl << "Ask another?(Y/N)" << endl;
string tmp;
getline(cin, tmp);
loop = tmp[0];
cout << string(3, '\n' );

您可以推荐您getline(cin, aString) receiving input without another enter以获得更好的理解