有什么方法可以在if语句中添加“ but”?

时间:2019-08-07 23:15:17

标签: c cs50

在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

1 个答案:

答案 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
}

(请注意,在大多数编程语言(以及几乎所有编译语言)中,中间变量根本不会损害性能,因为编译器足够聪明,可以知道它们根本不会改变函数的实际行为。有时它们可​​以甚至可以使程序更快,因为编译器可以推断出您的意图。