9

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

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

4

1 回答 1

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') ;

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

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

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

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

编辑在终端中按 Enter 通常(取决于终端设置)会做一些单独的事情:

  1. 插入\n输入缓冲区
  2. 刷新输入缓冲区
  3. 将输入光标向下移动一行
  4. 将输入光标移动到行首
于 2013-09-14T16:58:04.853 回答