Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初级水平。用C语言编码。遇到“问题”;如果不是这样的话;。_C_If Statement_Cs50_Vigenere - Fatal编程技术网

初级水平。用C语言编码。遇到“问题”;如果不是这样的话;。

初级水平。用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

有人能帮忙吗。我是编程和做cs50课程的新手。任务是基于一个码字对纯文本进行置乱。该语言是C语言,在linux上使用

我似乎一切正常,但在过去的两个小时里,我一直在绞尽脑汁试图修复编译程序时的最后一个错误。我遇到的问题是程序的下半部分(//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");    
}    
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();
这会奏效的。但这是什么呢