C 有没有办法让我把';但是';在if语句中?

C 有没有办法让我把';但是';在if语句中?,c,cs50,C,Cs50,在我的CS50课程中,我正在制作一个程序,根据用户输入的字符对消息进行加密 如果用户输入3,则消息的每个字母向右移动3个单位。为此,我将这些字母转换为ASCII码。不幸的是,当用户试图用任何形式的Z加密任何消息时,用户会被发回一个特殊字符,如括号或方括号。当原始ASCII码加上键(由用户输入)大于90或大于122时,也会发生这种情况。ASCII码90为Z,122为Z。为了解决这个问题,我设置了一个条件,当ASCII码大于90或122时,减去key的值。这当然也不起作用,因为当输入一个值时,比如一

在我的CS50课程中,我正在制作一个程序,根据用户输入的字符对消息进行加密

如果用户输入3,则消息的每个字母向右移动3个单位。为此,我将这些字母转换为ASCII码。不幸的是,当用户试图用任何形式的Z加密任何消息时,用户会被发回一个特殊字符,如括号或方括号。当原始ASCII码加上键(由用户输入)大于90或大于122时,也会发生这种情况。ASCII码90为Z,122为Z。为了解决这个问题,我设置了一个条件,当ASCII码大于90或122时,减去key的值。这当然也不起作用,因为当输入一个值时,比如一个键值为3的值。例如:当用户输入ZzAa时。除了a之外,每个字母都被加密成一个字母。”另一方面,'被加密为'^'。原因是a在ASCII码中为97,97大于90,但不是122,因此它减少到94,即“^”

我想知道在
if
语句中是否有一个“
but
”条件,这样我就可以设置条件:大于90但小于97,这样(
97
)就不会减少到94(
^

我试着输入一个逻辑Or和一个逻辑and。它们似乎都不起作用。它不起作用的一个例子是,输入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
#包括
#包括
#包括
int main(int argc,字符串argv[])
{
如果(argc!=2)
//如果用户不正确地使用该程序,它会向他们显示如何操作并退出该程序
{
printf(“用法:./caesar key\n”);
返回1;
}
//将用户输入的第二个值(键)存储到整数键中
int key=atoi(argv[1])%26;
char*ptext=get_字符串(“明文:”);
for(int i=0,n=strlen(ptext);i=90 | | ptext[i]>=122)
{
printf(“密文:%c\n”,ptext[i]-密钥);
printf(“密文:%i\n”,ptext[i]-密钥);
}
其他的
{
printf(“密文:%c\n”,ptext[i]+密钥);
printf(“密文:%i\n”,ptext[i]+密钥);
}
}
返回0;
}
这在很大程度上起了作用

使用括号将相互包含的逻辑表达式分组。您的
但是
实际上是一个
&&
),如下所示:

if( ( ptext[i] + key >= 90 && ptext[i] + key < 97 ) || ptext[i] >= 122 )
{
    // etc
}
if((ptext[i]+键>=90&&ptext[i]+键<97)| ptext[i]>=122)
{
//等
}
也就是说,我将使用一个中间变量,以便读者能够立即清楚地了解发生了什么:

const char clear   = ptext[i];
const char shifted = ptext[i] + key;

if( ( clear => 90 && clear < 97 ) || shifted >= 122 ) 
{
    // etc
}
const char clear=ptext[i];
常量字符移位=ptext[i]+键;
如果((清除=>90&清除<97)| |移位>=122)
{
//等
}

或考虑引入命名布尔值以使代码自文档化:

#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
}
#包括
...
const char clear=ptext[i];
常量字符移位=ptext[i]+键;
const bool isAscii=clear=>90&&clear<97;
常数布尔等距=移位>=122;
if(isAscii | | Isoutside)
{
//等
}

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

使用括号将相互包含的逻辑表达式分组。您的
但是
实际上是一个
&&
),如下所示:

if( ( ptext[i] + key >= 90 && ptext[i] + key < 97 ) || ptext[i] >= 122 )
{
    // etc
}
if((ptext[i]+键>=90&&ptext[i]+键<97)| ptext[i]>=122)
{
//等
}
也就是说,我将使用一个中间变量,以便读者能够立即清楚地了解发生了什么:

const char clear   = ptext[i];
const char shifted = ptext[i] + key;

if( ( clear => 90 && clear < 97 ) || shifted >= 122 ) 
{
    // etc
}
const char clear=ptext[i];
常量字符移位=ptext[i]+键;
如果((清除=>90&清除<97)| |移位>=122)
{
//等
}

或考虑引入命名布尔值以使代码自文档化:

#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
}
#包括
...
const char clear=ptext[i];
常量字符移位=ptext[i]+键;
const bool isAscii=clear=>90&&clear<97;
常数布尔等距=移位>=122;
if(isAscii | | Isoutside)
{
//等
}
(请注意,在大多数编程语言(以及几乎所有编译语言)中,中间变量根本不会影响性能,因为编译器足够聪明,知道它们根本不会改变函数的实际行为。有时,它们甚至可以使程序更快,因为编译器可以推断出更多关于您意图的信息)在命题逻辑中,“but”表示“and”。您使用逻辑and的尝试在此处最为重要。
printf(“用法:./caesar key\n”);返回1不一致。如果要将消息打印到stdout(使用情况消息应写入stdout),则应返回0。如果您认为这是一个错误(如返回1所示),那么错误消息应该写入STDRR。用法语句不是错误消息,因此您应该
返回EXIT\u SUCCESS
。在命题逻辑中,“but”表示“and”。您使用逻辑and的尝试在此处最为重要。
printf(“用法:./caesar key\n”);返回1不一致。如果要将消息打印到stdout(使用情况消息应写入stdout),则应返回0。如果您认为这是一个错误(如返回1所示),那么错误消息应该写入STDRR。用法语句不是错误消息,因此您应该
返回EXIT\u SUCCESS