如何将单个char转换为int

jon*_*nsb 56 c++ char

我有一串数字,例如"123456789",我需要提取它们中的每一个以在计算中使用它们.我当然可以通过索引访问每个char,但是如何将其转换为int?

我查看了atoi(),但它需要一个字符串作为参数.因此,我必须将每个char转换为字符串,然后在其上调用atoi.有没有更好的办法?

Bin*_*ier 137

您可以利用以下事实:数字的字符编码都是从48(对于'0')到57(对于'9')的顺序.这适用于ASCII,UTF-x和几乎所有其他编码(有关此内容的更多信息,请参阅下面的注释).

因此,任何数字的整数值都是数字减去'0'(或48).

char c = '1';
int i = c - '0'; // i is now equal to 1, not '1'
Run Code Online (Sandbox Code Playgroud)

是的同义词

char c = '1';
int i = c - 48; // i is now equal to 1, not '1'
Run Code Online (Sandbox Code Playgroud)

但是我发现第一个c - '0'更具可读性.

  • 这是一种有趣的方法.我从没想过这样做.我想每天都学到新东西. (6认同)
  • 关于编码和数字的顺序,我问了这个问题http://stackoverflow.com/questions/782373/are-digits-represented-in-sequence-in-all-text-encodings.简短的回答是"基于Ascii或EBCDIC的任何编码,是的"(这意味着我们将在日常生活和网络中遇到99.9%的编码).同样有趣的是,c/c ++标准似乎表明它们只支持数字排序的编码. (4认同)
  • 是否存在'9' - '0'!= 9的编码?我甚至不确定每个ISO C++是否允许这样的编码. (3认同)
  • C++标准保证"0"到"9"在字符集中以相反的顺序出现.所以`c - '0'`适用于所有系统,而`c - 48`则不适用于EBCDIC. (3认同)
  • 请注意,C11 [§5.2.1 字符集 ¶3](http://port70.net/~nsz/c/c11/n1570.html#5.2.1p3) 表示: _在源和执行基本字符集中,上述十进制数字列表中“0”之后的每个字符的值应比前一个字符的值大 1。 C++ 标准也有类似的规则。 (2认同)

jal*_*alf 8

或者您可以使用"正确"方法,类似于您原来的atoi方法,但使用std :: stringstream.这应该与字符作为输入和字符串一起使用.(boost :: lexical_cast是更方便语法的另一种选择)

(atoi是一个旧的C函数,通常建议在可能的情况下使用更灵活和类型安全的C++等价物.std :: stringstream涵盖到字符串的转换)