初学者级。用 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");
}
如果 if
或 else
块有多个语句,您需要用大括号将它们括起来。为了安全起见,很多程序员都会一直包含大括号。
//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)
。但是,这不太可能对学生练习中涉及的数据的代码产生可衡量的好处 — 但如果您重复处理数兆字节的数据,这两个变化都可能很重要。
问题是你的 if
和 else
之间的语句太多了!
要使用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
}
在if
和else
之后是否只对单行使用curlys存在不同意见,但是readability, maintainability and reliability 是足以虔诚地使用大括号的理由。
有人可以帮忙吗。我是编程和学习 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");
}
如果 if
或 else
块有多个语句,您需要用大括号将它们括起来。为了安全起见,很多程序员都会一直包含大括号。
//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)
。但是,这不太可能对学生练习中涉及的数据的代码产生可衡量的好处 — 但如果您重复处理数兆字节的数据,这两个变化都可能很重要。
问题是你的 if
和 else
之间的语句太多了!
要使用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
}
在if
和else
之后是否只对单行使用curlys存在不同意见,但是readability, maintainability and reliability 是足以虔诚地使用大括号的理由。