这个C ++代码有什么问题,有时它会正常运行但很多时候它不会给我任何结果?我无法准确指出问题的来源,但我认为有一些非法表达会产生一个未定义的结果。顺便说一句,我在Android上使用C4Droid,我认为它几乎支持所有C ++ 11功能,而且在这个特定代码中没有C ++ 11表达式。 或者也许它是编译器?
# include <iostream>
# include <string>
using namespace std;
int main ()
{
const string hexdigits = "0123456789ABCDEF"; // possible hex digits
cout<< "Enter a series of numbers between 0 and 15"
<< " separated by spaces. Hit ENTER when finished: "
<< endl;
string result; // will hold the resulting hexify'd string
string::size_type n; // hold numbers from the input
while (cin >> n)
if (n < hexdigits.size()) // only accept invalid input
result += hexdigits[n]; // fetch the indicated hex digit
cout << "Your hex number is: " << result << endl;
}
输入:11 15 7 8
答案 0 :(得分:1)
如果您提供有效输入,然后按 Enter ,程序仍在等待更多输入。
cin >> n
跳过前导空格,然后读取整数值。 '\n'
(Enter键)是空格。您需要触发和结束文件条件才能终止循环:对于Unix / Linux, Ctrl-D ,对于Windows, Ctrl-Z 。
或者从其他来源将输入提供给程序:
echo 11 15 7 8 | the_program
在类UNIX系统上,如果程序正在从键盘读取输入,则可以通过在行的开头键入 Ctrl.D 来触发文件结束条件,或者通过在一行中间两次输入 Ctrl-D 。
答案 1 :(得分:0)
根据cppreference,operator>>
的行为方式如下:
9)表现为UnformattedInputFunction。建成之后 检查sentry对象,从输入流中提取所有数据 并将其存储到某人。如果满足以下条件之一,则提取将停止 条件得到满足:
- 文件结尾出现在输入序列上;
- 在输出序列中插入失败(在这种情况下,不会提取要插入的字符);
- 发生异常(在这种情况下会捕获异常,并且只启用failbit上的重新抛出异常)。
如果启用std::skipws
,则提取将丢弃空白字符(包括the linefeed),因此, ENTER 不会像提示所暗示的那样终止循环。
正如Tony D.在comments中建议的那样,您可以使用std::getline
提取直到分隔符(默认情况下为换行符)。您的程序可能如下所示:
std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);
while (iss >> n)
{
if (n < hexdigits.size()) // only accept valid input
result += hexdigits[n]; // fetch the indicated hex digit
}
std::cout << "Your hex number is: " << result << std::endl;
答案 2 :(得分:-1)
Ctrl + D工作。我想我需要的是一个文件结尾。虽然我必须按两次Ctrl + D才能工作。不知道为什么。