我使用getline方法获取用户输入的消息时遇到问题,我使用的是:
string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);
但是,它没有停止获取输出值,这有什么问题?
答案 0 :(得分:83)
如果您在getline()
之后使用cin >> something
,则需要在两者之间从缓冲区中清除换行符。您可以使用cin.ignore()
。
这将是这样的:
string messageVar;
cout << "Type your message: ";
cin.ignore();
getline(cin, messageVar);
这是因为>>
运算符在输入缓冲区中留下了换行符\n
。当您执行未格式化的输入(例如getline()
)时,这可能会成为问题,该输入读取输入直到找到换行符。发生这种情况后,它会立即停止阅读,因为您之前的操作中留下了\n
。
答案 1 :(得分:5)
如果输入中只有一个换行符,只需执行
std::cin.ignore();
会正常工作。它从输入中读取并丢弃下一个字符。
但是如果输入中还有其他内容,除了换行符(例如,你读了一个单词但是用户输了两个单词),那么你必须这样做
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
参见例如this reference of the ignore
function
为了更加安全,请在循环中执行上面的第二个替换,直到gcount
返回零。
答案 2 :(得分:2)
int main(){
.... example with file
//input is a file
if(input.is_open()){
cin.ignore(1,'\n'); //it ignores everything after new line
cin.getline(buffer,255); // save it in buffer
input<<buffer; //save it in input(it's a file)
input.close();
}
}
答案 3 :(得分:2)
我有类似的问题。一个缺点是,使用cin.ignore(),你必须按下输入1再次与程序混淆。
答案 4 :(得分:0)
我知道我要迟到了,但是我希望这会有所帮助。 如果用户要输入多行,则逻辑一次只能一行一行
int main()
{
int t; // no of lines user wants to enter
cin>>t;
string str;
cin.ignore(); // for clearing newline in cin
while(t--)
{
getline(cin,str); // accepting one line, getline is teminated when newline is found
cout<<str<<endl;
}
return 0;
}
输入:
3
政府拼贴Berhampore
Serampore纺织拼贴
Berhampore Serampore
输出:
政府拼贴Berhampore
Serampore纺织拼贴
Berhampore Serampore
答案 5 :(得分:-1)
我认为你没有在程序结束之前暂停程序,所以在获得inpus之后你输出的输出没有在屏幕上看到了吗?
做的:
getchar();
在节目结束前
答案 6 :(得分:-1)
代码是正确的。问题必须在其他地方。尝试使用std :: getline文档中的简约示例。
main ()
{
std::string name;
std::cout << "Please, enter your full name: ";
std::getline (std::cin,name);
std::cout << "Hello, " << name << "!\n";
return 0;
}