我正在将字符串中的每个字符转换为其前一个字符。
这是我写的代码:
if (str[index] == 'a')
strCopy[index] = 'z';
else if (str[index] == 'A')
strCopy[index] = 'Z';
else
strCopy[index] = (char)(((int)str[index]) - 1);
我正在遍历每个字符并计算前一个字符。
在 C 中有没有更简洁的方法来做到这一点
答案 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) 1
或 Ctrl A 从 string 转换为 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;
查表最快。