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
相关产品推荐
相关产品推荐

