【问题标题】:How to properly convert char to int in c++?如何在 C++ 中正确地将 char 转换为 int?
【发布时间】:2016-04-14 21:48:18
【问题描述】:

在 c++ 中将 char 转换为 int 时,我遇到了一个以前从未遇到过的独特问题。

我正在遍历一个名为 total_line 的整数字符串,其内容如下:

1526

我正在尝试将所有其他 char 转换为 int,这是我的代码:

cout << total_line[i+1] <<endl;
int d = total_line[i+1] <<endl;
cout << d << endl;
i++;

我的输出奇怪的是:

5
53
6
54

我不确定为什么 5 被转换为 int 53 而 6 被转换为 int 54。

【问题讨论】:

  • 您没有显示足够的代码。向我们展示total_line 的声明,它是如何初始化的,以及变量i 的值。
  • 字符本质上是以 ASCII 格式输入的。 '5' == 53。查看ASCII table
  • 您将数字(如五,我手上的手指数)与数字表示混淆,如数字“5”(一个看起来很像字母“S”的符号)。

标签: c++ c++11 char int


【解决方案1】:

正如其他人所提到的,字符实际上表示为映射到字符表的数字。数字到字符的映射因所选字符集而异,例如,对于 US-ASCII,字符 '1''2' 对应于数字 49 和 50 (see here for the full US-ASCII table)。

要将数字的字符串表示形式转换为有符号整数,请使用std::stoi(C++11 起)。

下面的 sn-p 会将字符串分割成单独的数字,并分别使用std::stoi 将它们转换为数字。

for (std::string::size_type i = 0, n = total_line.size(); i != n; ++i) {
    int d = std::stoi(total_line.substr(i, 1));

    std::cout << d << std::endl;
}

使用标准库函数std::stoi 的优点是无论字符编码如何都能正常工作。

【讨论】:

    【解决方案2】:

    看看ascii table(linux上的man ascii)

         Oct   Dec   Hex   Char
         ---------------------
         060   48    30    0
         061   49    31    1
         062   50    32    2
         063   51    33    3
         064   52    34    4
      -> 065  |53|   35   |5|
      -> 066  |54|   36   |6|
         067   55    37    7 
         070   56    38    8 
         071   57    39    9  
    

    所以你可以看到,之所以将 5 转换为 53,将 6 转换为 54,是因为 char '5' 的 decimal 值不是 5,而是53(与 6 相同)。

    如果您想将 char 转换为 int,请尝试以下操作:

    int d = total_line[i] - '0';
    

    我不会推荐你这个:

    int d = total_line[i] - 48;
    

    因为portability(感谢Pete Becker),并不是每个人都知道'0'的十进制值,所以我认为直接使用'0'更容易理解。

    【讨论】:

      【解决方案3】:

      这行看起来很奇怪:

      int d = total_line[i+1] <<endl;
      

      operator&lt;&lt;endl 流在那里做什么?

      为什么不简单地这样做呢?

      int d = total_line[i+1];
      

      【讨论】:

        【解决方案4】:

        您需要从位置i 而不是i+1 读取,并且第二行中还有一个额外的endl。您获得的值是您尝试读取的字符的ASCII 值。为了将它们转换为int,您需要从中减去 '0' 的 ASCII 值。此外,如果您在 for 循环中操作,则无需显式增加 i。这可能是你跳过字符的原因

        这可能会有所帮助:

        cout << total_line[i] <<endl;
        int d = total_line[i];
        cout << d - '0' << endl;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-02
          • 1970-01-01
          • 2017-11-21
          • 2012-06-04
          • 2015-07-11
          • 1970-01-01
          • 2011-03-31
          相关资源
          最近更新 更多