将字符串转换为每个字母都转换为前一个字母的字符串

时间:2021-07-31 06:58:44

标签: c

我正在将字符串中的每个字符转换为其前一个字符。
这是我写的代码:

if (str[index] == 'a')
    strCopy[index] = 'z';
else if (str[index] == 'A')
    strCopy[index] = 'Z';
else
    strCopy[index] = (char)(((int)str[index]) - 1);

我正在遍历每个字符并计算前一个字符。

在 C 中有没有更简洁的方法来做到这一点

2 个答案:

答案 0 :(得分:0)

这是我想出的:

#include <string.h>

...

char tempStr = '\0';

for (int i = 0; i < strlen(str); i++) 
{
    tempStr = str[i];

    switch(tempStr)
    {
        case 'A':
            str[i] = 'Z';
            break;
        case 'a':
            str[i] = 'z';
            break;
        default:
            str[i] = tempStr - 1;
            break;
    }
}

...

这可能是一种改进的原因(即“更整洁”):

Switch 语句成为条件语句的合适选择,因为 C 中的 switch 语句比较整数,而且它在内部效率更高,因为 C 在编译代码时为它创建了一个查找表(尽管在这种情况下可能没有那么多)。它也比嵌套的 if-then-else 语句更具可读性/优雅。

答案 1 :(得分:0)

<块引用>

在 C 中是否有更简洁的方法(?)
...每个字母都转换为前一个字母

首先测试字符,因为 unsigned char 是一个字母 - 使用 <ctype.h> 函数。我们当然希望避免将 (char) 1Ctrl Astring 转换为 null 字符

unsigned char ch = string[index];
if (isalpha(ch)) {

假设我们仅将 [A-Z] 和 [a-z] 作为连续字符处理 - 如在 ASCII 中。

  if (isupper(ch)) {
    ch--;
    if (ch < 'A') ch = 'Z;
  } else {
    ch--;
    if (ch < 'a') ch = 'z;
  }

  string[index] = ch;

单衬是可能的,但不是更清晰:

string[index] += isalpha((unsigned char) string[index]) ?
    (toupper(string[index]) > 'A' ? -1 : 25) : 0;

查表最快。