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

CS50 Week2 Substitution:字符串转大写报错求助

解决toupper函数未使用返回值的编译错误

错误原因解释

你遇到的编译错误核心问题是:toupper函数不会直接修改传入的字符,而是返回转换后的大写字符,但你的代码仅调用了toupper(key[i]),完全忽略了它的返回值。

编译器的[-Wunused-value]警告专门检测这种“调用了有返回值的纯函数却未使用结果”的场景,而你的编译选项通过-Werror将所有警告升级为错误,因此直接终止了编译流程。

修正代码

把转换大写的循环修改为以下形式,将toupper的返回值赋值回原字符串的对应位置,即可解决错误:

string key = argv[1];

for (int i = 0; i < len; i++)
{
    // 转为unsigned char避免符号位导致的未定义行为
    if (islower((unsigned char)key[i]))
    {
        key[i] = toupper((unsigned char)key[i]);
    }
}

额外代码优化提示

你的main函数存在潜在崩溃风险:当前代码先执行int len = strlen(argv[1]);,之后才检查argc != 2。如果用户运行程序时未传入参数,argv[1]为NULL,调用strlen(NULL)会直接导致程序崩溃。建议调整检查顺序:

int main(int argc, string argv[])
{
    // 先检查参数数量是否合法
    if (argc != 2)
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }

    int len = strlen(argv[1]);
    if (len != 26)
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }

    // 后续字符合法性检查、重复字符检查代码...
}

内容的提问来源于stack exchange,提问作者DKXP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:20:35