【问题标题】:Can a keyboard ENTER be interpreted as a string::size_type?可以将键盘 ENTER 解释为 string::size_type 吗?
【发布时间】:2020-03-25 16:09:21
【问题描述】:

我正在尝试使用此代码将 0-15 之间的整数转换为十六进制:

#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::string;

int main()
{
    const string hexstring = "0123456789ABCDEF";
    string str;
    string::size_type n;
    string result_str;
    while (cin >> n){
        if (n < hexstring.size()){
            result_str += hexstring[n];         
        }
    }
    cout << result_str << endl;
    return 0;
}

我想要的是当用户键入时:

12 13 14 15

然后按 ENTER,预期的输出应该是:

CDEF

但是,即使在按 ENTER 后,仍会提示用户输入。我的印象是 ENTER 不是 string::size_type 类型,因此违反了 while 循环条件,导致循环退出。为什么输入 ENTER 后条件仍然成立?

【问题讨论】:

  • \n 是一个空格字符,&gt;&gt; 跳过前导空格。您可能应该使用std::getline 读取一行,然后使用std::istringstream 或其他方式解析它。
  • @HolyBlackCat ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

标签: c++ while-loop infinite-loop


【解决方案1】:

在执行格式化输入时(如您所愿),“Enter”既不是字符也不是终止条件。它只是一块空白(如空格或制表符),默认情况下会被跳过以进行数据提取。

因此,它“做”的唯一一件事就是在您的终端客户端中触发行缓冲,并将到目前为止写入的字符发送到您的程序,在那里进行处理(连同换行符,正如我刚才所说的那样被忽略)。

如果您想一次读取一行,请使用std::getline。这将准确读取一行输入。然后你可以用std::stringstream 或其他东西来解析它。

你可以make std::cin not skip whitespace,但是你的数字之间的空格也会结束循环。

【讨论】:

    【解决方案2】:

    如果输入不会被中断循环

    while (cin >> n){
        if (n < hexstring.size()){
            result_str += hexstring[n];         
        }
    }
    

    是无限的。

    要中断循环,您可以输入非数字,例如字母“A”。

    在循环之前你可以输出类似的提示

    std::cout << "Enter a sequence of non-negative numbers. Press 'q' to quit.\n"  ;
    

    【讨论】:

      猜你喜欢
      • 2015-06-25
      • 1970-01-01
      • 2011-07-28
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2010-10-02
      • 1970-01-01
      相关资源
      最近更新 更多