哈佛CS50第二周凯撒作业ceasar.c报expected identifier或'('错求助
错误原因及修复方案
核心编译报错根因
你触发ceasar.c:9:1: error: expected identifier or '(' {报错的直接原因有2个:
int main(int argc, string argv[]);末尾多写了分号:C语言中函数定义的头部不能带分号,加分号属于函数原型声明,不能直接接函数体int num;放在了main函数头部和函数体大括号之间,属于语法错误,函数内部变量必须定义在大括号包裹的函数体内部
你之前删除main末尾分号仍报错,就是因为int num的位置不合法导致的。
其他需要修正的语法/逻辑问题
k == argv[2];存在三处错误:- 变量k未提前声明类型
==是比较运算符,赋值操作需要用=- 命令行参数下标错误:如果要求用户传1个参数k,你做了
argc !=2的判断,对应k的参数是argv[1],且argv存储的是字符串类型,需要转为整数才能用于加密计算
Output数组未声明,后续引用时还写成了小写output,大小写不匹配- 加密计算后直接把数值赋值给字符数组,没有转回到对应的ASCII字母区间
- 末尾printf尝试输出
output[i],i是for循环内的局部变量,循环结束后已失效,且打印字符串需要传入数组首地址而非单个元素 - 未给密文字符串补充结束符
\0,直接打印会出现乱码
修正后可运行代码
#include <stdio.h> #include <cs50.h> #include <string.h> #include <stdlib.h> int main(int argc, string argv[]) { // 先校验参数数量 if(argc != 2) { printf("K not included in command"); return 1; } // 把输入的字符串k转为整数 int k = atoi(argv[1]); int num; string s = get_string("Insert Lowercase Message:"); // 声明存储密文的数组,长度和输入一致,加1存字符串结束符 char output[strlen(s) + 1]; for (int i = 0, n = strlen(s); i < n; i++) { if (s[i] >= 'A' && s[i] <= 'Z') { num = s[i] - 'A'; output[i] = (num + k) % 26 + 'A'; } else if (s[i] >= 'a' && s[i] <= 'z') { num = s[i] - 'a'; output[i] = (num + k) % 26 + 'a'; } // 非字母字符直接保留 else { output[i] = s[i]; } } // 补充字符串结束符 output[strlen(s)] = '\0'; printf("Secret message %s\n", output); return 0; }
内容的提问来源于stack exchange,提问作者Quise
相关产品推荐
相关产品推荐

