初学者级。用 C 语言编码。遇到 "if else" 的问题。

Beginner level. Coding in C. Having trouble with "if else".

有人可以帮忙吗。我是编程和学习 cs50 课程的新手。任务是根据代码字对纯文本进行加扰。语言是 C 和 linux.

我似乎一切正常,但在过去的 2 个小时里我一直在努力修复编译程序时的最后一个错误。我遇到的问题是程序的下半部分(在//密码函数位之后)

这是错误:

viginere.c:39:5: error: expected expression
else 
^
viginere.c:44:5: error: expected expression
else
^
2 errors generated.

我看不出我做错了什么。

我在几个不同的地方弄乱了 {},但我不认为这是问题所在,因为这个程序是我之前制作的程序的修改版本,那个程序可以工作,具有相同的布局(只是不同printf 略有不同)我错过了什么?

这是我的代码:

int main (int argc, string argv[])  
{
//change command line string to a number
int k = atoi(argv[1]);
string v = argv[1];

//check program command line was typed correctly
if (argc != 2 || k != 0)
    { 
    printf("Restart program with keyword in command line (alphabetical characters only)\n");
    return 1;
    }

//Get Plain Text
printf("The keyword is set to %s.\nType in your plain text: ", argv[1]);
string s = GetString();

//Print Cipher
printf("Your cipher text = ");

//Set variables for mudulo on keyword
int codecount = strlen(argv[1]);
int c = 0;

//Cipher function (Errors are in this part)
for (int i = 0; i < strlen(s); i++)
    {
    //Cipher uppercase
    if (isupper(s[i]))
    printf("%c", (s[i] + v[c%codecount] - 65)%26 + 65);
    c++;   
    //Else Cipher lowercase
    else 
    if (islower(s[i]))
    printf("%c", (s[i] + v[c%codecount] - 97)%26 + 97);
    c++;
    //Print all else as normal
    else
    printf("%c", s[i]);
    }
printf("\n");    
}    

如果 ifelse 块有多个语句,您需要用大括号将它们括起来。为了安全起见,很多程序员都会一直包含大括号。

//Cipher uppercase
if (isupper(s[i])) {
    printf("%c", (s[i] + v[c%codecount] - 65)%26 + 65);
    c++;   
}
//Else Cipher lowercase
else if (islower(s[i])) {
    printf("%c", (s[i] + v[c%codecount] - 97)%26 + 97);
    c++;
}
//Print all else as normal
else {
    printf("%c", s[i]);
}

您在 if 的 body 周围遗漏了 { }。如果你不在 body 周围加上大括号,它只是下一个语句。由于您的 else 不是紧跟在该语句之后,因此它不会被识别为与 if.

匹配
if (isupper(s[i])) {
    printf("%c", (s[i] + v[c%codecount] - 65)%26 + 65);
    c++;
}
//Else Cipher lowercase
else if (islower(s[i])) {
    printf("%c", (s[i] + v[c%codecount] - 97)%26 + 97);
    c++;
}
//Print all else as normal
else {
    printf("%c", s[i]);
}

即使 body 中只有一个语句,我也建议您始终用大括号括起来。参见 Why is it considered a bad practice to omit curly braces?

为了使 else 有效,您需要在 if 之后将多个语句括起来:

int len = strlen(s);
for (int i = 0; i < len; i++)
{
    //Cipher uppercase
    if (isupper(s[i]))
    {
        printf("%c", (s[i] + v[c%codecount] - 65)%26 + 65);
        c++;
    }
    //Else Cipher lowercase
    else if (islower(s[i]))
    {
        printf("%c", (s[i] + v[c%codecount] - 97)%26 + 97);
        c++;
    }
    //Print all else as normal
    else
        printf("%c", s[i]);
    printf("\n");
}

有些人每次都喜欢用牙套。我认为这不是必需的,但它是无害的并且可以帮助你,尤其是在你学习的时候。

或者,在此代码变体中,您可以通过在 printf() 调用中使用增量来避免单独的语句:

int len = strlen(s);
for (int i = 0; i < len; i++)
{
    if (isupper(s[i]))         // Cipher uppercase
        printf("%c", (s[i] + v[c++ % codecount] - 'A') % 26 + 'A');
    else if (islower(s[i]))    // Cipher lowercase
        printf("%c", (s[i] + v[c++ % codecount] - 'a') % 26 + 'a');
    else                       // Non-alphabetic
        printf("%c", s[i]);
}
printf("\n");

这个版本还用'A'代替了65,用'a'代替了97;它使人们更容易理解。这种压缩技术并不总是有效,即使有效也应谨慎使用,但它可以在这样的代码中使用。它还只在字符串末尾打印一个换行符(或者如果字符串中有换行符),而不是将每个字符放在自己的行上。

显示的两种变体也避免在循环条件中使用 strlen(s);最终,这对性能不利,尽管您需要在长消息变得可测量之前对其进行加密。也有人认为代码应该使用 putchar(char_value) 而不是 printf("%c", char_value)。但是,这不太可能对学生练习中涉及的数据的代码产生可衡量的好处 — 但如果您重复处理数兆字节的数据,这两个变化都可能很重要。

问题是你的 ifelse 之间的语句太多了!

要使用if...else,您必须创建一个块或给出一个语句。真的,结果是一样的。换句话说:

if(x==1) do_this();
else do_that();

这行得通。但更典型的(也是你想要的)是创建一个 "Block":

if(x==1) {
  do_this();
  and_that();
} else { do_some_other_things(); }

希望对您有所帮助!

使用大括号...

if(condition) 导致要执行多行代码时,每个 必须 用大括号括起来。

if(condition)
{
    statement1();
    statement2();//without brackets this would not be executed
}

同理,如果有多行要执行当且仅当if(condition)为false时,也必须用大括号括起来在 else 关键字之后开始。

...
else
{
    statement3();
    statement4();//without brackets, this would not be executed
}

ifelse之后是否只对单行使用curlys存在不同意见,但是readability, maintainability and reliability 是足以虔诚地使用大括号的理由。