键盘ENTER是否可以解释为字符串::size_type



我正在尝试使用此代码将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后条件仍然成立?

在执行格式化输入时(按照您的实际情况(,"Enter"既不是字符,也不是终止条件。它只是一块空白(比如空格或制表符(,默认情况下,为了提取数据,它会被跳过。

因此,它"做"的唯一一件事就是在终端客户端中触发行缓冲,并将迄今为止写入的字符发送到程序中,在程序中对它们进行处理(以及换行符,正如我刚才所说,它被忽略了(。

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

你可以让std::cin而不是跳过空白,但数字之间的空格也会结束循环。

如果输入不会中断,则循环

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"  ;

最新更新