【问题标题】:Basic String input基本字符串输入
【发布时间】:2013-09-19 04:15:50
【问题描述】:

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

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

【问题讨论】:

    标签: c++ string input getline cin


    【解决方案1】:

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

    因此,在第一个 cin 之后,名称变量将包含 John。缓冲区中仍然会有Smith\n,您已经使用以下方法解决了这个问题:

    cin.ignore( 256, '\n') ;
    

    注意:正如 Konrad Rudolph 所建议的,您确实不应该在代码中使用 256 或任何其他幻数。而是使用std::numeric_limits&lt;std::streamsize&gt;::max()。以下是文档对istream::ignore 的第一个参数的说明:

    要提取(和忽略)的最大字符数。 如果这恰好是numeric_limits&lt;streamsize&gt;::max(),则没有限制:根据需要提取尽可能多的字符,直到找到 delim(或文件结尾)。

    cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n') ;
    

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

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

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

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

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

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

    【讨论】:

    • 请不要在代码中使用幻数。这里正确的是std::numeric_limits&lt;std::streamsize&gt;::max()。
    • 感谢有关 cin.ignore 函数的提示,我一定会记下以供进一步使用。那么,当在命令提示符下按下返回键时,是否可以说返回键会做两件事,既输入 /n 作为输入的一部分,又将输入流向下移动一行? (我知道这个术语不正确,但这是我可以表达它的唯一方法)否则缓冲区中留下的“Smith/n”不会就像用户再次按下 Return 键一样吗?抱歉,这条评论根本没有格式化,我是新手,不过感谢您的回复!
    • 非常感谢!我敢肯定,这甚至算不上真正的问题,但是您花时间回答它真是太好了。非常感谢,谢谢。
    • @user2779581 #include &lt;limits&gt;
    • 糟糕,我没有看到答案已解决按钮:P 再次感谢大家!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多