我遇到了一个我在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。
答案 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}}