【问题标题】:Beginner level. Coding in C. Having trouble with "if else".初学者级。用 C 编码。“if else”有问题。
【发布时间】:2015-11-16 00:44:21
【问题描述】:

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

我似乎一切正常,但在过去的 2 个小时里,我一直在努力解决编译程序时出现的最后一个错误。我遇到的问题是程序的下半部分(在 //Cipher 功能位之后

这是错误:

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");    
}    

【问题讨论】:

  • if 之后的多个语句需要大括号才能使else 有效。此外,当他的名字拼写错误时,维热内尔很可能会在坟墓里上交。
  • 你的 for 循环中缺少 if+else 语句的括号
  • 非常感谢大家,结果我设法让它工作了。还将文件名更改为 Vigenere....

标签: c if-statement cs50 vigenere


【解决方案1】:

如果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]);
}

【讨论】:

    【解决方案2】:

    您的if 主体周围缺少{ }。如果您不在身体周围放置大括号,那只是下一个语句。由于您的 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]);
    }
    

    即使正文中只有一个语句,我建议您始终在其周围放置大括号。见Why is it considered a bad practice to omit curly braces?

    【讨论】:

    • “总是大括号”是一个见仁见智的问题;我,一方面,不同意。但是我也不同意 OTBS。
    • @JonathanLeffler 如果您非常聪明,以至于您总是记得在将第二个语句添加到正文时添加大括号,所有权力都归您。大多数人都会犯错误,而且总是要做好准备来避免它。
    • @JonathanLeffler 我已经更改了我的答案以表明这是我的观点,而不是绝对的。开心吗?
    • 好的。我去了这个问题,接受的答案并不完全支持问题的标题。我不记得上次忘记戴牙套被咬是什么时候了。使用 Allmann 编码风格意味着这真的不是问题。
    【解决方案3】:

    if 之后的多个语句需要大括号才能使else 有效:

    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)。但是,这不太可能对学生练习中涉及的数据的代码产生可衡量的好处——但如果您重复处理数兆字节的数据,这两种更改都可能非常重要。

    【讨论】:

      【解决方案4】:

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

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

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

      这会奏效。但是更典型的(也是你想要的)是创建一个“块”:

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

      希望有帮助!

      【讨论】:

        【解决方案5】:

        使用大括号...

        if(condition) 导致多行要执行时,每个必须用大括号封装。

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

        同样,如果有多行应该执行当且仅当if(condition) 为假,它们也必须用大括号括起来,从else 关键字开始.

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

        ifelse 之后是否应该只对单行使用curlys 有不同的意见,但readability, maintainability and reliability 足以使用curly虔诚地括号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多