You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

哈佛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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 14:24:00