基本字符串输入
Basic String input
我刚刚遇到了这段允许用户在命令提示符下输入字符串的代码。我知道他们在做什么,一切都很棒。但是我有一个关于 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 键(取决于终端设置)会执行一些单独的操作:
- 将
n
插入输入缓冲区 - 刷新输入缓冲区
- 将输入光标向下移动一行
- 将输入光标移动到行首
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 用户输入字符串的文件附加问题..C++
- 从 cin 读取不会返回整个输入字符串
- 输出返回编号。等于输入字符串的单词的字符串数
- 控制台未正确读取输入字符串
- 使用终止程序的指针在数组中输入字符串
- 如何删除用户输入字符串末尾的空字符?
- 在循环中使用 cin.get() 输入字符串
- 如何从输入字符串中提取特定位置的字符?
- 用户输入字符串的结构的搜索向量
- 无法使用 getline() 输入字符串.它只读取一个字符串
- 如何在 c++ 中读取输入字符串,忽略空格
- FSTREAM的问题读取确定,但不编写用户输入字符串
- boost::split会在输入字符串不是常量时更改输入字符串吗?
- 通过键盘输入字符串数组和 int 数组的数组大小
- Zlib 放气输入大于原始输入字符串的字符
- C 忽略输入字符串
- 获取一个输入字符串,将其转换为其十六进制值,然后将其十六进制存储为 int
- 我无法将 Excel 中的输入字符串存储为二维字符串
- 如何识别输入的输入字符串在 c++ 中是两个还是多个单词