基本字符串输入

use*_*581 9 c++ string input cin getline

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

现在当这是输出时,我得到了一些东西:(使用约翰史密斯作为输入)

Please enter your full name: john smith
Welcome John
Please enter your full name again: That's better thanks Smith
Run Code Online (Sandbox Code Playgroud)

我理解为什么会发生这种情况,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 ;
Run Code Online (Sandbox Code Playgroud)

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

Nem*_*ric 8

你看,当你输入"John Smith"作为输入时,首先cin >> name不会读取整行,而是直到第一个空格的行的内容.

因此,在第一个之后cin,name变量将包含John.Smith\n缓冲区中仍然存在,您使用以下方法解决了这个问题:

cin.ignore( 256, '\n') ;
Run Code Online (Sandbox Code Playgroud)

注意:正如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') ;
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么在"请再次输入您的全名"之后没有换行?

因为您没有向stdout输出一个,并且用户没有机会按Enter键.getline将从Smith\n缓冲区读取,它将立即继续.它不会将任何换行符回显到您的控制台 - getline不会这样做.

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

这是用户使用Enter密钥输入的换行符,它不是来自您的程序.

编辑在终端中按Enter键(取决于终端设置)几乎没有单独的内容:

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

  • 哦,我完全错过了OP的代码. (2认同)