首先,我是编码新手,我想了一会儿这个问题,我试着谷歌一下。我已经有了一个变通办法,我只是想知道是否有可能以另一种方式。我在上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
或更宽的整数类型,并以更宽的类型执行计算,产生该类型的结果。如果需要赋值给更窄类型的对象,则再次将其缩小。
但是,请注意
-
如果初始值不能在目标类型中表示,则向有符号整数类型的窄化转换具有实现定义的行为。这可能包括引发实现定义的信号。当最高有效字节包含非零的值时,假设它们将被截断是不安全的。
-
你所描述的并不是代码所呈现的实际功能。特别是,我认为你在谈论这个:
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。第一个if
将ui[]
更改为65 + 70 - 26 = 109,即'm'。这也将触发第二个if
语句,再次导致溢出。
我怀疑两个if
体应该在相同的值上执行。如果没有,则需要在第二个if
之前添加一个else
。
}
else if (islower(ui[i])) {
...