C中的char到int转换

Ori*_*ski 35 c char

如果我想将单个数字转换为char数字值,例如,如果:

char c = '5';
Run Code Online (Sandbox Code Playgroud)

而我想c坚持5而不是'5',100%便携式这样做吗?

c = c - '0';
Run Code Online (Sandbox Code Playgroud)

我听说所有字符集都按顺序存储数字,所以我假设是这样,但我想知道是否有一个有组织的库函数来进行这种转换,以及它是如何按常规方式完成的.我是一个真正的初学者:)

unw*_*ind 27

是的,这是一种安全的转换.C要求它起作用.该保证在最新的ISO C标准的第5.2.1节第2节中,最近的草案是N1570:

基本源和基本执行字符集都应具有以下成员:
[...]
10个十进制数字
0 1 2 3 4 5 6 7 8 9
[...]
在源和执行基本字符集中,上面列表中0之后的每个字符的值十进制数字应大于前一个值.

ASCII和EBCDIC以及从它们派生的字符集都满足这个要求,这就是C标准能够强加它的原因.请注意,字母在EBCDIC 中不是连续的,C不要求它们.

单个函数没有库函数char,您需要先构建一个字符串:

int digit_to_int(char d)
{
 char str[2];

 str[0] = d;
 str[1] = '\0';
 return (int) strtol(str, NULL, 10);
}
Run Code Online (Sandbox Code Playgroud)

atoi()一旦你有一个字符串,你也可以使用该函数进行转换,但strtol()更好更安全.

正如评论者指出的那样,调用函数进行这种转换是极端的过度杀伤力; 你最初减去'0'的方法是这样做的正确方法.我只想说明如何使用推荐的将数字作为字符串转换为"真实"数字的标准方法.

  • 这是一种非常复杂和昂贵的方式来做一个非常直接的操作,即int i = d - '0' (4认同)
  • 这是您的问题的答案,但不是最佳答案.这太过分了.你用c = c-'0'回答了你自己的问题; - 这是最好的答案. (2认同)

lsa*_*mon 9

试试这个 :

char c = '5' - '0';
Run Code Online (Sandbox Code Playgroud)


wel*_*tty 5

您可以使用atoi,它是标准库的一部分.


spi*_*ire 5

int i = c - '0';
Run Code Online (Sandbox Code Playgroud)

你应该知道这不会对角色进行任何验证 - 例如,如果角色是'a'那么你会得到91 - 48 = 49.特别是如果你正在处理用户或网络输入,你可能应该执行验证以避免程序中的不良行为.只需检查范围:

if ('0' <= c &&  c <= '9') {
    i = c - '0';
} else {
    /* handle error */
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您希望转换处理十六进制数字,则可以检查范围并执行适当的计算.

if ('0' <= c && c <= '9') {
    i = c - '0';
} else if ('a' <= c && c <= 'f') {
    i = 10 + c - 'a';
} else if ('A' <= c && c <= 'F') {
    i = 10 + c - 'A';
} else {
    /* handle error */
}
Run Code Online (Sandbox Code Playgroud)

这会将单个十六进制字符(大写或小写独立)转换为整数.