我正在制作一个名叫吉尔伯特的机器人,他充满了愚蠢。到目前为止。
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;
}
}
答案 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以获得更好的理解