c++ - 如何将字符数转换为十进制数并返回或将 ASCII 'A' -'Z'/'a' -'z' 转换为字母偏移量 0 for 'A'/'a' ...?

标签 c++ c ascii

如果你有一个在 '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/

相关文章:

c++ - openssl c++ 需要以十六进制格式显示公钥

c++ - Operator+ 没有返回我期望的 C++

c - 如何使用 malloc 将 C 中的 int 变量转换为 char *array?

将变量与常量进行比较不起作用?

ruby-on-rails - 抛出 normalize_yaml_input 中的无效字节序列错误?

c++ - 为什么在 C++ 中在公共(public)成员之下定义私有(private)成员?

c++ - ncurses & curses - 编译器 undefined reference

c - 输入文件时出现 SegFault

Python - 编码字符串 - 瑞典字母

java - 确定 ISO-8859-1 与 US-ASCII 字符集