基本字符串输入

Basic String input

本文关键字:输入 字符串      更新时间:2023-10-16

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

现在,当输出时,我得到的内容大致如下:(使用约翰史密斯作为输入)

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 ;

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

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

所以,在第一个cin之后,name 变量将包含 John 。缓冲区中仍有Smithn,您已使用以下方法解决此问题:

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将从缓冲区读取Smithn,并立即继续。它不会将任何换行符回显到您的控制台 - getline不会这样做。

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

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

编辑 通常在终端中按 Enter 键(取决于终端设置)会执行一些单独的操作:

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