【发布时间】:2021-01-19 05:37:42
【问题描述】:
首先,我是编码新手,我曾想过这个问题,并尝试用谷歌搜索。 我已经有一个解决方法,我只想知道是否可以通过其他方式。 我正在上cs50课程,我应该写一个加密函数。
我的问题是,我的 char 暂时大于 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;
}
}
它会被截断,例如如果输入 z 时 key 变得大于 6。
所以我可以以某种方式编写它,26 在它进入存储之前被减去,或者(我认为 atm)不可能,因为一旦它变得大于 127,即使它在一行中,它也会被截断?
解决方法(我想现在写): 我会在之前减去 96,所以我会用 1 到 27 之间的数字进行计算并在之后添加。
提前感谢您的建议。
【问题讨论】:
-
首先,“截断”听起来你实际上是指它溢出。对于有符号值,溢出的行为是未定义的(或至少是实现定义的)。通常,如果您希望这样做,应该使用
unsigned char执行此类数学运算。此外,不建议使用硬编码的 ASCII 值常量。考虑像@987654323@ 这样的东西。如果性能很重要,您可以考虑为每个值使用查找表,从而无需调用任何isupper或任何分支。 -
离题:多么有趣的风格。谁教给你的?
-
嗯,在用 C 语言编程大约 40 年的时间里,我从未在自己的行中看到像
if和for这样的关键字。而且我看到了很多代码...... -
不喜欢这种风格50。如果您是编码新手,那么您的思维方式是错误的。这是 C 而不是 Lisp。
-
@chqrlie 我再次检查了它,你是对的。也许我误解了“在 if 和条件之间留一个空格”和“在 if 和条件之间留出一个空格”的符号。但如上所述,答案是“看起来不错”。我个人不喜欢上面的风格,所以我不会继续它。感谢您指出。
标签: c ascii cs50 truncate caesar-cipher