我刚刚遇到了一些允许用户在命令提示符下输入字符串的代码。我知道他们做了什么,这一切都很棒。但是我对cin和getline()函数有疑问。
string name ;
cout << "Please enter your full name: " ;
cin >> name ;
cout << "Welcome " << name << endl ;
cout << "Please enter your full name again please: " ;
getline(cin , name) ;
cout << "That's better, thanks " << name << endl ;
return 0 ;
现在当这是输出时,我得到了以下内容:(使用john smith作为输入)
Please enter your full name: john smith
Welcome John
Please enter your full name again: That's better thanks Smith
我理解为什么会发生这种情况,getline仍在从输入缓冲区读取,我知道如何修复它。我的问题是,为什么在“请再次输入您的全名”之后没有换行?当我将代码更改为:
string name ;
cout << "Please enter your full name: " ;
cin >> name ;
cout << "Welcome " << name << endl ;
cout << "Please enter your full name again please: " ;
cin.ignore( 256, '\n') ;
getline(cin , name) ;
cout << "That's better, thanks " << name << endl ;
return 0 ;
在您再次输入全名后,我突然收到换行符。说实话,这不是一个大问题。但我不介意知道发生了什么,如果有人可以帮助我。谢谢!
答案 0 :(得分:8)
你看,当你输入“John Smith”作为输入时,cin >> name
将不会读取整行,而是直到第一个空格的行内容。
因此,在第一个cin
之后,name变量将包含John
。缓冲区中仍然有Smith\n
,您已使用以下方法解决了这个问题:
cin.ignore( 256, '\n') ;
注意:正如Konrad Rudolph建议的那样,你真的不应该在你的代码中使用256或任何其他幻数。而是使用std::numeric_limits<std::streamsize>::max()
。以下是关于istream::ignore
的第一个参数的文档:
要提取(和忽略)的最大字符数。 如果这正是
numeric_limits<streamsize>::max()
,则没有限制:根据需要提取多个字符,直到找到delim(或文件结尾)。
cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n') ;
我的问题是,为什么在“请再次输入您的全名”之后没有换行符?
因为您没有向stdout输出一个,并且用户没有机会按Enter键。 getline
将从缓冲区中读取Smith\n
,它会立即继续。它不会将任何换行符回显到您的控制台 - getline
不会这样做。
在您再次输入全名后,我突然收到换行符。说实话,这不是一个大问题。但我不介意知道发生了什么,如果有人可以帮助我。谢谢!
这是用户使用Enter
键输入的换行符,它不是来自您的程序。
编辑通常在终端按Enter键(取决于终端设置)几乎没有单独的内容:
\n
插入输入缓冲区