如果你有一个在 '0' 到 '9' 范围内的字符,你如何将它转换为 0 到 9 的 int 值
然后如何将其转换回来?
同时给定字母“A”到“Z”或“a”到“z”,如何将它们转换为 0-25 范围然后再转换回来?
针对ASCII进行优化是可以的
最佳答案
C++ 指定的基本字符编码使得在“0”到“9”之间的转换变得容易。
C++ 指定:
In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
这意味着,无论'0'的整数值是多少,'1'的整数值是'0' + 1
,'2'的整数值是'0 ' + 2
,依此类推。使用此信息和基本算术规则,您可以轻松地将 char 转换为 int 并返回:
char c = ...; // some value in the range '0' - '9'
int int_value = c - '0';
// int_value is in the range 0 - 9
char c2 = '0' + int_value;
将字母“a”到“z”可移植地转换为 0 到 25 之间的数字并不那么容易,因为 C++ 没有指定这些字母的值是连续的。在 ASCII 中,它们是连续的,您可以编写依赖于上述代码的代码,类似于“0”-“9”。 (现在 ASCII 被广泛使用)。
可移植代码将改为使用查找表或对每个字符进行特定检查:
char int_to_char[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
int char_to_int[CHAR_MAX + 1] = {};
for (int i=0; i<sizeof(int_to_char); ++i) {
char_to_int[int_to_char[i]] = i;
}
// convert a lowercase char letter to a number in the range 0 - 25:
int i = char_to_int['d'];
// convert an int in the range 0 - 25 to a char
char c = int_to_char[25];
在 C99 中,您可以直接初始化 char_to_int[]
数据而无需循环。
int char_to_int[] = {['a'] = 0, ['b'] = 1, ['c'] = 2, ['d'] = 3, ['e'] = 4, ['f'] = 5, ['g'] = 6, ['h'] = 7, ['i'] = 8, ['j'] = 9, ['k'] = 10, ['l'] = 11, ['m'] = 12, ['n'] = 13, ['o'] = 14, ['p'] = 15, ['q'] = 16, ['r'] = 17, ['s'] = 18, ['t'] = 19, ['u'] = 20, ['v'] = 21, ['w'] = 22, ['x'] = 23, ['y'] = 24, ['z'] = 25};
同样支持 C99 的 C++ 编译器可能在 C++ 中也支持此功能,作为扩展。
这是一个完整的程序,可以生成用于这些转换的随机值。它使用 C++,加上 C99 指定的初始化扩展。
#include <cassert>
int digit_char_to_int(char c) {
assert('0' <= c && c <= '9');
return c - '0';
}
char int_to_digit_char(int i) {
assert(0 <= i && i <= 9);
return '0' + i;
}
int alpha_char_to_int(char c) {
static constexpr int char_to_int[] = {['a'] = 0, ['b'] = 1, ['c'] = 2, ['d'] = 3, ['e'] = 4, ['f'] = 5, ['g'] = 6, ['h'] = 7, ['i'] = 8, ['j'] = 9, ['k'] = 10, ['l'] = 11, ['m'] = 12, ['n'] = 13, ['o'] = 14, ['p'] = 15, ['q'] = 16, ['r'] = 17, ['s'] = 18, ['t'] = 19, ['u'] = 20, ['v'] = 21, ['w'] = 22, ['x'] = 23, ['y'] = 24, ['z'] = 25};
assert(0 <= c && c <= sizeof(char_to_int)/sizeof(*char_to_int));
int i = char_to_int[c];
assert(i != 0 || c == 'a');
return i;
}
char int_to_alpha_char(int i) {
static constexpr char int_to_char[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
assert(0 <= i && i <= 25);
return int_to_char[i];
}
#include <random>
#include <iostream>
int main() {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 m(seed);
std::uniform_int_distribution<int> digits{0, 9};
std::uniform_int_distribution<int> letters{0, 25};
for (int i=0; i<20; ++i) {
int a = digits(m);
char b = int_to_digit_char(a);
int c = digit_char_to_int(b);
std::cout << a << " -> '" << b << "' -> " << c << '\n';
}
for (int i=0; i<20; ++i) {
int a = letters(m);
char b = int_to_alpha_char(a);
int c = alpha_char_to_int(b);
std::cout << a << " -> '" << b << "' -> " << c << '\n';
}
}
关于c++ - 如何将字符数转换为十进制数并返回或将 ASCII 'A' -'Z'/'a' -'z' 转换为字母偏移量 0 for 'A'/'a' ...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20529247/