初级水平。用C语言编码。遇到“问题”;如果不是这样的话;。
有人能帮忙吗。我是编程和做cs50课程的新手。任务是基于一个码字对纯文本进行置乱。该语言是C语言,在linux上使用 我似乎一切正常,但在过去的两个小时里,我一直在绞尽脑汁试图修复编译程序时的最后一个错误。我遇到的问题是程序的下半部分(//Cipher函数位之后的) 这就是错误:初级水平。用C语言编码。遇到“问题”;如果不是这样的话;。,c,if-statement,cs50,vigenere,C,If Statement,Cs50,Vigenere,有人能帮忙吗。我是编程和做cs50课程的新手。任务是基于一个码字对纯文本进行置乱。该语言是C语言,在linux上使用 我似乎一切正常,但在过去的两个小时里,我一直在绞尽脑汁试图修复编译程序时的最后一个错误。我遇到的问题是程序的下半部分(//Cipher函数位之后的) 这就是错误: viginere.c:39:5: error: expected expression else ^ viginere.c:44:5: error: expected expression else ^ 2 erro
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");
}
intmain(intargc,字符串argv[])
{
//将命令行字符串更改为数字
int k=atoi(argv[1]);
字符串v=argv[1];
//检查程序命令行键入是否正确
如果(argc!=2 | | k!=0)
{
printf(“在命令行中使用关键字重新启动程序(仅限字母字符)\n”);
返回1;
}
//获取纯文本
printf(“关键字设置为%s。\n请在纯文本中键入:”,argv[1]);
字符串s=GetString();
//打印密码
printf(“您的密码文本=”);
//在关键字上为mudulo设置变量
int codecount=strlen(argv[1]);
int c=0;
//密码函数(本部分中有错误)
对于(int i=0;i
如果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
或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
的主体周围缺少{}
。如果你不在身体上套上支架,那只是下一句话。由于您的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]);
}
即使你的身体里只有一句话,我建议你总是用括号括起来。请参见如果
,则在的主体周围缺少{}
。如果你不在身体上套上支架,那只是下一句话。由于您的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]);
}
即使你的身体里只有一句话,我建议你总是用括号括起来。请参见您需要在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");
}
此版本还使用'A'
代替65
,'A'
代替97
;它使人们更容易理解。这种压缩技术并不总是有效的,即使它确实有效,也应该谨慎使用,但它可以在这样的代码中使用。它也只在字符串末尾打印一个换行符(或者如果字符串中有换行符),而不是将每个字符放在自己的行上
所示的两种变体也避免在循环条件下使用strlen
;这最终对性能不利,尽管您需要对长消息进行加密,然后才能对其进行测量。有人还可能认为代码应该使用putchar(char\u值)
而不是printf(“%c”,char\u值)
。然而,这不太可能对学生练习中涉及的数据的代码产生可测量的好处,但如果你反复处理兆字节的数据,这两个变化都可能是显著的。你需要在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");
}
此版本还使用'A'
代替65
,'A'
代替97
;它使人们更容易理解。这种压缩技术并不总是有效的,即使它确实有效,也应该谨慎使用,但它可以在这样的代码中使用。它也只在字符串末尾打印一个换行符(或者如果字符串中有换行符),而不是将每个字符放在自己的行上
所示的两种变体也避免在循环条件下使用strlen
;这最终对性能不利,尽管您需要对长消息进行加密,然后才能对其进行测量。有人还可能认为代码应该使用putchar(char\u值)
而不是printf(“%c”,char\u值)
。然而,这不太可能对学生练习中涉及的数据的代码产生可测量的好处,但如果您反复处理兆字节的数据,这两个变化都可能非常显著。问题在于您的if
和else
之间的语句太多
要使用if…else
,必须创建一个块或给出一条语句。真的,结果是一样的。换言之:
if(x==1) do_this();
else do_that();
这会奏效的。但更典型的(也是您想要的)是创建一个“块”:
希望有帮助 问题是在if
和else
之间有太多语句
要使用if…else
,必须创建一个块或给出一条语句。真的,结果是一样的。换言之:
if(x==1) do_this();
else do_that();
这会奏效的。但这是什么呢