基本字符串输入

时间:2013-09-14 16:29:12

标签: c++ string input getline cin

我刚刚遇到了一些允许用户在命令提示符下输入字符串的代码。我知道他们做了什么,这一切都很棒。但是我对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 ;

在您再次输入全名后,我突然收到换行符。说实话,这不是一个大问题。但我不介意知道发生了什么,如果有人可以帮助我。谢谢!

1 个答案:

答案 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键(取决于终端设置)几乎没有单独的内容:

  1. \n插入输入缓冲区
  2. 刷新输入缓冲区
  3. 将输入光标向下移动一行
  4. 将输入光标移动到行的开头