【问题标题】:C++ Detecting ENTER key pressed by userC ++检测用户按下的ENTER键
【发布时间】:2010-05-10 14:41:31
【问题描述】:

我有一个循环,要求用户输入名称。当用户按下 ENTER 键或输入 20 个名称时,我需要停止。但是,当用户按下 ENTER 键时,我的方法不会停止

//loop until ENTER key is entered or 20 elements have been added
bool stop = false;
int ind = 0;
while( !stop || ind >= 20 ){

    cout << "Enter name #" << (ind+1) << ":";
    string temp;
    getline(cin, temp);
    int enterKey = atoi(temp.c_str());        

    if(enterKey == '\n'){
        stop = true;            
    }
    else{
        names[ind] = temp;
    }

    ind++;


}

【问题讨论】:

    标签: c++ user-input getline


    【解决方案1】:

    你用atoi将读取的字符串转换成整数:

    int enterKey = atoi(temp.c_str());        
    

    如果 temp 是像 "1234" 这样的字符串,这会将 enterKey 设置为 1234。然后将enterKey 与\n 的ASCII 值进行比较。这很可能没有做任何有用的事情。

    另外std::getline 只读取字符直到但不包括下一个'\n'。如果用户只是按下回车键而不输入任何其他字符,std::getline 将返回一个空字符串。如果一个字符串是空的,可以很容易地用它的empty() 方法测试:

    getline(cin, temp);
    if (temp.empty()) {
      stop = true;
    }
    

    【讨论】:

      【解决方案2】:

      getline 会吃掉你的分隔符,它是'\n',所以你可能想要检查一个空字符串。在调用 atoi 之前执行此操作。

      【讨论】:

        【解决方案3】:

        尝试:

        while( !stop && ind < 20 )
        

        或:

        using namespace std;
        vector <string> names; // edited.
        for (int ind = 0; ind < 20; ++ind)
        {
            cout << "Enter name #" << (ind+1) << ":"; 
            string temp;
            getline(cin, temp); 
            if (temp.empty())
                break;
            names.push_back(temp);
        }
        

        【讨论】:

        • 是的,我完全同意,for 循环是要走的路。你的代码有一个错误。结果向量将有 20 个空字符串,后跟一些响应。
        • 您遗漏了 atoi 步骤。您应该使用 vector 而不是 vector
        • @James:他应该检查输入的长度(以检测空行),并且应该检查流状态,因为这只是很好的编码。
        • @jmucchiell,OP 没有将 int 插入容器中,int 仅用于检测新行。
        • 感谢@Geoff 编辑正确。输入一半时改变主意将使用名称[ind],因此 user69514 不会太困惑,而是采用最佳实践...
        【解决方案4】:

        改用stop = temp.empty()。 getline 不应包含任何换行符。空行应该产生一个空字符串。

        另外,Charles 是正确的,您的 while 条件不正确,请使用 while( !stop &amp;&amp; ind &lt; 20)。您编写它的方式,用户需要输入 20 个值和一个空行。 Charles 的更改说在满足任何一个条件(不是同时满足两者)时都会中断。

        为了完整起见,这里是提议的新代码:

        bool stop = false;
        int ind = 0;
        while( !stop && ind < 20 ){
        
            cout << "Enter name #" << (ind+1) << ":";
            string temp;
            getline(cin, temp);
            if(temp.empty()) {
                stop = true;
            } else {
                names[ind] = temp;
            }
        
            ind++;    
        }
        

        就个人而言,我会编写如下代码:

        vector<string> names;
        for(int ind = 0; ind < 20; ind++) {
          cout << "Enter name #" << (ind + 1) << " (blank to stop): ";
          string name;
          getline(cin, name);
          if(name.empty() || cin.eof()) {
             break;
          }
          names.push_back(name);
        }
        
        cout << "Read " << names.length() << " names before empty line detected." << endl;
        

        【讨论】:

        • 为什么不直接在 temp.empty() 时中断?那你就不需要else结构了
        • 啊。是的。应该是 <.>
        • 你也忘了翻转 ind >= 20 条件。
        • 我同意,它应该是一个带中断的 for 循环。如果我们重新编写所有内容,那么 OP 最初的问题可能就不清楚了。
        • 我添加了我的个人偏好,我认为这与您的@jmucchiello 一致
        【解决方案5】:

        你想使用 cin.get();辛 >> 温度;我相信。

        【讨论】:

        • cin &gt;&gt; temp 只会给出一个令牌。 OP 可能需要包含空格的语句。
        猜你喜欢
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多