在CS50课程中,我正在制作一个程序,其中将根据用户输入的字符对消息进行加密。
如果用户输入3,则消息的每个字母向右移动3个单位。为此,我将这些字母转换为ASCII码。不幸的是,当用户尝试用任何形式的Z加密任何消息时,都会向用户发送回特殊字符,例如括号或方括号。当原始ASCII码加上键(由用户输入)大于90或大于122时,也会发生这种情况。ASCII码90为Z,122为z。为了解决这个问题,我提出了一个条件,规定ASCII码大于90或122时,减去key的值。当然,这也不起作用,因为当输入诸如a的值且键的值为3时。例如:当用户输入ZzAa时。除a之外的每个字母都加密为一个字母。另一方面,“ a”被加密为“ ^”。原因是ASCII码中的a是97,而97大于90但不是122,因此它减少为94,即'^'。
我想知道but
语句中是否存在'if
'条件,以便我可以输入条件:大于90但小于97,因此(97
)不会减少为94(^
)
我尝试放入逻辑或和逻辑与。他们似乎都不起作用。一个不起作用的例子是,您输入3作为密钥,并输入ZzAa作为加密的测试消息。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(int argc, string argv[])
{
if (argc != 2)
// If the user uses the program incorrectly, it shows them how to do it and quits the program
{
printf("Usage : ./caesar key\n");
return 1;
}
// stores the second value inputted by the user(key) into an integer key
int key = atoi(argv[1]) % 26;
char *ptext = get_string("Plaintext : ");
for (int i = 0, n = strlen(ptext); i < n; i++)
{
if(ptext[i] + key >= 90 || ptext[i] >= 122)
{
printf("Cipher text: %c\n ", ptext[i] - key);
printf("Cipher text: %i\n ", ptext[i] - key);
}
else
{
printf("Cipher text: %c\n ", ptext[i] + key);
printf("Cipher text: %i\n ", ptext[i] + key);
}
}
return 0;
}
This worked for the most part
答案 0 :(得分:6)
使用括号将相互包含的逻辑表达式分组。您的but
实际上是and
(&&
),如下所示:
if( ( ptext[i] + key >= 90 && ptext[i] + key < 97 ) || ptext[i] >= 122 )
{
// etc
}
也就是说,我将使用一个中间变量,以便读者可以立即了解发生了什么情况:
const char clear = ptext[i];
const char shifted = ptext[i] + key;
if( ( clear => 90 && clear < 97 ) || shifted >= 122 )
{
// etc
}
或考虑引入命名布尔值以使代码自记录:
#include <stdbool.h>
...
const char clear = ptext[i];
const char shifted = ptext[i] + key;
const bool isAscii = clear => 90 && clear < 97;
const bool isOutsideRange = shifted >= 122;
if( isAscii || isOutsideRange )
{
// etc
}
(请注意,在大多数编程语言(以及几乎所有编译语言)中,中间变量根本不会损害性能,因为编译器足够聪明,可以知道它们根本不会改变函数的实际行为。有时它们可以甚至可以使程序更快,因为编译器可以推断出您的意图。