如何在c ++中正确地将char转换为int?

时间:2016-04-14 21:48:18

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

我遇到了一个我在c ++中将char转换为int之前没有遇到的独特问题。

我正在遍历一个名为total_line的整数字符串,其读作:

1526

我正在尝试将每个其他字符转换为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。

4 个答案:

答案 0 :(得分:3)

正如其他人所提到的,字符实际上表示为映射到字符表的数字。数字到字符的映射根据所选的字符集而不同,例如,对于US-ASCII,字符'1''2'对应于数字49和50({{ 3}})。

要将数字的字符串表示形式转换为有符号整数,请使用see here for the full US-ASCII table(自C ++ 11起)。

以下代码段会将字符串整理成各自的数字,并使用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具有无论字符编码如何都可以工作的优势。

答案 1 :(得分:2)

看看ascii table(Linux上的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 &#39; 5&#39的十进制值;不是5而是53(与6相同)。

如果你想将char转换为int,请尝试以下方法:

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

我不推荐你这个:

int d = total_line[i] - 48;

由于portability(感谢Pete Becker),并非所有人都知道&#39; 0&#39;的十进制值。并直接使用&#39; 0&#39;我认为更容易理解。

答案 2 :(得分:0)

这一行看起来很奇怪:

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

operator<<endl在那里做什么?

为什么不简单地这样做?

int d = total_line[i+1];

答案 3 :(得分:0)

您需要从位置i+1而不是endl读取,并且在第二行还有一个额外的ASCII。您获得的值是您尝试阅读的字符的int值。要将它们转换为for,您需要减去&#39; 0&#39;的ASCII值。从中。而且,如果您在i循环中操作,则不需要明确增加cout << total_line[i] <<endl; int d = total_line[i]; cout << d - '0' << endl; 。这可能就是你跳过字符的原因

这可能有所帮助:

{{1}}