它可以是string :: size_type类型吗?

时间:2014-08-29 00:48:52

标签: c++

这个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

3 个答案:

答案 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)

根据cppreferenceoperator>>的行为方式如下:

  

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才能工作。不知道为什么。