基本字符串输入

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 ;

现在输出这个时,我得到了类似以下内容的结果:(以输入的约翰·史密斯为例)
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个回答

8
你看,当你输入“John Smith”作为第一个输入时,cin >> name不会读取整行内容,而是只读取到第一个空格的内容。
因此,在第一次cin后,name变量将包含John。缓冲区中仍然有Smith\n,你可以使用以下代码解决:
cin.ignore( 256, '\n') ;

注意:正如Konrad Rudolph建议的那样,您真的不应该在代码中使用256或任何其他魔术数字。而是使用std::numeric_limits::max()。以下是关于istream::ignore的第一个参数的文档所说的内容:
最大要提取(和忽略)的字符数。如果这恰好是numeric_limits::max(),则没有限制:需要提取尽可能多的字符,直到找到delim(或文件结束)。
cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n') ;

我的问题是,为什么在“请再次输入您的全名:”之后没有换行符?
因为你没有将其输出到标准输出,并且用户没有机会按Enter键。getline将从缓冲区中读取Smith\n,并立即继续进行。它不会在控制台上回显任何换行符——getline不会这样做。
突然之间,在重新输入您的全名后我得到了一个换行符。说实话,这不是一个很大的问题。但如果有人能帮我解答一下发生了什么,我倒是不介意。谢谢!
这是用户Enter键输入的换行符,而不是来自您的程序。
编辑 在终端上按Enter键通常会(根据终端设置)执行以下几个操作:
1.将\n插入输入缓冲区
2.清空输入缓冲区
3.将输入光标向下移动一行
4.将输入光标移动到行首

1
请勿在代码中使用魔数。正确的做法是 std::numeric_limits<std::streamsize>::max() - Konrad Rudolph
谢谢您提供关于cin.ignore函数的提示,我会记下来以备将来使用。那么,在命令提示符中按下回车键时,是否可以说它执行了两个不同的操作,即将/n作为输入的一部分并将输入流向下移动一行?(我知道这个术语不正确,但这是我能表达的唯一方式)否则,缓冲区中留下的'Smith/n'会像用户再次按下Return键一样起作用吗?非常抱歉,我的评论没有任何格式,我还是新手,感谢您的回复! - user2779581
1
非常感谢!我确信这几乎算不上一个真正的问题,但您花时间回答它真是太好了。非常感激,谢谢。 - user2779581
1
@user2779581 #include <limits> - Nemanja Boric
1
糟糕,我没看到答案已解决的按钮:P 再次感谢大家! - user2779581
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接