C语言 是否可以计算暂时大于127的ASCII数字?



首先,我是编码新手,我想了一会儿这个问题,我试着谷歌一下。我已经有了一个变通办法,我只是想知道是否有可能以另一种方式。我在上cs50课程,我应该写一个加密函数。

我的问题是,我的字符暂时大于127,然后被截断。因此,在我保存它之前,是否有可能临时计算某个字符到一个内存地址并截断它?

我认为问题应该是:

for
(int i = 0; i < strlen(ui); i++)
{
if
(isupper(ui[i]))
{
ui[i] += key;
if
(ui[i] > 90)
{
ui[i] -= 26;
}
}
if
(islower(ui[i]))
{   
ui[i] += key;
if
(ui[i] > 122)
{
ui[i] -= 26;
}
}

,它被截断,例如,如果键值大于6,输入为z

那么我能不能这样写,26在进入存储之前被减去,或者(我认为)不可能,因为一旦它比127大,即使它在一行中,它也会被截断?

解决方法(我现在想写):我将在之前减去96,这样我就可以计算出1到27之间的数字,然后再加上它。

谢谢你的建议。

我的问题是,我的char暂时大于127,然后被截断。那么,在我将其保存到内存地址并截断它之前,是否有可能临时计算某个字符?

是的,这是可能的,你不需要做任何特别的事情来实现它。在C表达式中,所有小于int的整数类型的算术操作数都转换为int或更宽的整数类型,并以更宽的类型执行计算,产生该类型的结果。如果需要赋值给更窄类型的对象,则再次将其缩小。

但是,请注意

  1. 如果初始值不能在目标类型中表示,则向有符号整数类型的窄化转换具有实现定义的行为。这可能包括引发实现定义的信号。当最高有效字节包含非零的值时,假设它们将被截断是不安全的。

  2. 你所描述的并不是代码所呈现的实际功能。特别是,我认为你在谈论这个:

ui[i] += key;

在这种情况下计算ui[i] + key不是问题,但是在将结果写入内存之前没有特别的延迟。这就是+=的赋值部分。

你最好完全避免这种情况。例如,

if (islower((unsigned char) ui[i])) {
ui[i] = (((ui[i] - 'a') + key) % 26) + 'a';
}
但是,也要注意,该代码(和您的原始代码)假设一个连续块的小写字母的数值。这通常是正确的,但并非普遍如此。

在评论中提到了一个可能的溢出错误,然而,代码中可能还有另一个错误,也许,我不知道你的算法应该是什么。

考虑当ui[i]是'Z' (90 ASCII)和密钥':' (58 ASCII)时。'Z'是大写的,所以执行第一个if语句的主体,导致ui[]是90 + 58 - 26 = 122,现在是'Z',注意是小写的。

现在z是小写的,所以第二个if的体也执行,结果ui[]现在是122 + 58 - 26 = 154。这在ASCII范围之外,所以会出现溢出。

另一个例子是ui[] = 'A'和键70。第一个ifui[]更改为65 + 70 - 26 = 109,即'm'。这也将触发第二个if语句,再次导致溢出。

我怀疑两个if体应该在相同的值上执行。如果没有,则需要在第二个if之前添加一个else

}
else if (islower(ui[i])) {
...

最新更新