处理 C 语言中的 ASCII 字母


#include <stdio.h>
#include <string.h>
int main()
{
int key;
char line[500];
char ch = '';
int i = 0;
printf("Enter key: ");
scanf("%d", &key);
getchar();
printf("Enter line: ");
while(ch != 'n')
{
ch = getchar();
line[i] = ch;
i++;    
}
int length = i; 
int k = 0;
char temp[length];
for(i = 0; i < length; i++)
{
if((int)line[i] >= 65 && (int)line[i] <= 90)
{           
temp[k++] = (int)line[i] + key;
} else if((int)line[i] >= 97 && (int)line[i] <= 122){
temp[k++] = (int)line[i] + key;
} else {
temp[k++] = line[i];
}
}
printf("n");
for(i = 0; i < length; i++)
{
printf("%c", temp[i]);
}
}

到目前为止,我所做的是将字符转换为另一个字符。例如,如果我输入"abc ABC"并且加法值(int键)是3,那么它应该打印出"def DEF"。

这工作正常,但我想进一步实现的是,如果角色超出界限,则倒带它。例如,如果我输入"XYZ"并且加法值为 3,它应该打印出"ABC",而不是"[]"。我可以得到任何关于如何解决这个问题的帮助或建议吗?谢谢。。

首先,当我看到

if((int)line[i] >= 65 && (int)line[i] <= 90)

我的第一反应是,"65和90是什么意思? 嗯,我知道,但是,这些数字对你来说是一个不必要的麻烦,它们对读者来说是一个不必要的麻烦。 所以就说

if(line[i] >= 'A' && line[i] <= 'Z')

相反。 在 C 中,字符常量(如'A')的值是机器字符集中字符的值,或 ASCII 中的 65。 (我也摆脱了一些不必要的演员表。

接下来,解决问题的一种蛮力方法是检查溢出:

if(line[i] >= 'A' && line[i] <= 'Z')
{
temp[k] = line[i] + key;
if(temp[k] > 'Z')
temp[k] -= 26;
k++;
}

由于我必须用temp[k]做几件事才能完成它,所以我将k++移到了最后。

您将对 a-z 情况使用类似的代码。

如果要使程序更通用,则key也可能是负面的。 在这种情况下,您还必须担心字母"小于"A。 您可以像这样扩展代码:

if(line[i] >= 'A' && line[i] <= 'Z')
{
temp[k] = line[i] + key;
if(temp[k] > 'Z')
temp[k] -= 26;
else if(temp[k] < 'A')
temp[k] += 26;
k++;
}

同样,您将对 a-z 案例重复此操作。

现在,这样做的非蛮力方法是认识到我们在这里做的"环绕"算术也被称为"模"算术,因为它与"模"或"余数"运算符有关,%。 因此,如果您了解%的工作原理,则可以编写如下代码:

if(line[i] >= 'A' && line[i] <= 'Z')
{
int c = line[i] - 'A';
c = (c + key) % 26;
temp[k++] = c + 'A';
}

这仍然不是完全直截了当的,因为我们必须从像"Y"这样的字母,到它在字母表中从0开始的位置(25),到它的移位值(28,假设key为3),到它的"模"值{2},最后回到像"B"这样的字母。

或者,更详细地说,大写字母在 ASCII 中是 65 到 90。 所以我们减去 65 得到 0-25 范围内的数字。 一旦我们在 0-25 范围内,我们就可以使用模算术,因为% 26基本上意味着"只有 0 - 25 范围内的整数"。 最后,当我们完成模运算时,我们再次添加 65,以回到实际字母的 65-90 范围。 (我们不是减加 65,而是减去和加'A',因为它的值相同,但更清晰。

而且,再一次,我仍然只显示大写字母的代码;你也必须为a-z大小写重复这个代码。

最新更新