c - 如何以循环方式向下移动字母字符?

标签 c

我想找到比我早 7 个字符的字母表字符,所以我编写了这个函数来实现它并且工作正常:

char find7_before(char letter){
    switch (letter){
        case 'g':
          return 'z';
          break;
        case 'f':
          return 'y';
          break;
        case 'e':
          return 'x';
          break;
        case 'd':
          return 'w';
          break;
        case 'c':
          return 'v';
          break;
        case 'b':
          return 'u';
          break;
        case 'a':
          return 't';
          break;
        default:
        return (char)(((int)letter) - 7);
    }
}

但我认为我可以在没有所有这些情况的情况下以更聪明的方式做到这一点,但我就是想不通! (我想出了如何以循环方式在后面找到 7 个字母)任何帮助或想法或提示? 谢谢:)

最佳答案

假设 ASCII 连续 ['a' , 'z']...

简单的“mod 26”。

letter = ((letter - 'a' - 7) mod 26) + 'a';

然而 C 没有欧几里得模运算符。
参见 What's the difference between “mod” and “remainder”?

因此创建一个Euclidean mod 函数 - 保存以备后用。

int modulo_Euclidean(int a, int b) {
  int m = a % b;
  if (m < 0) {
    // m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
    m = (b < 0) ? m - b : m + b;
  }
  return m;
}



letter = modulo_Euclidean(letter - 'a' - 7, 26) + 'a';

另外,代码可以利用 'a' 的值为 97 而不是减去太多以至于 letter - ('a'%26) - 7 变为负数.

letter = (letter - ('a'%26) - 7)%26 + 'a';

迂腐的代码不会假设连续的['a' , 'z'] 并执行更复杂的代码。

关于c - 如何以循环方式向下移动字母字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57650655/

相关文章:

C: lseek() 相关问题

c - 如何找到两个单词相差多少距离>>有没有最短的方法

c - 结构中的可变长度数组

c++ - FFMPEG: ‘PIX_FMT_BGR24’ 未在此范围内声明

c - 让我的 C 代码更短

c - 以编程方式打开核心/故障转储

C 套接字 : recv and send all data

c - 使用工作线程模式时如何正确处理信号?

将指针转换为连接

c - Makefile 不起作用 - 添加新文件