如果我想将单个数字转换为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 = 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)
这会将单个十六进制字符(大写或小写独立)转换为整数.