可能是字符串::size_type类型

Could it be the string::size_type type?

本文关键字:type 类型 size 字符串      更新时间:2023-10-16

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

如果您提供了有效的输入,然后按Enter,程序仍在等待更多的输入。

cin >> n跳过前导空白,然后读取一个整数值。'n'(回车键)是空白。您需要触发和文件结束条件来终止循环:对于Unix/Linux,Ctrl-D;对于Windows,Ctrl-Z

或者从另一个来源向程序输入:

echo 11 15 7 8 | the_program

在类似UNIX的系统上,如果程序正在从键盘读取输入,则可以通过在一行的开头键入Ctrl.D或在一行中间键入Ctrl-D两次来触发文件结尾条件。

根据cppreference,operator>>的行为方式如下:

9) 表现为未格式化的输入函数。在建造和检查哨兵对象,从输入流中提取所有数据并将其存储给某人。如果出现以下情况之一,提取将停止满足条件:

  • 文件结尾出现在输入序列上
  • 在输出序列中插入失败(在这种情况下,不提取要插入的字符)
  • 发生异常(在这种情况下,捕获异常,并且只启用故障位上的重新抛出异常)

如果启用了std::skipws,提取将丢弃空白字符(包括换行符),因此,ENTER不会像提示所暗示的那样终止循环。

正如Tony D.在评论中所建议的那样,您可以使用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;

Ctrl+D有效。我想我需要的是文件的末尾。尽管我必须按两次Ctrl+D才能工作。不知道为什么。