CS50 Week2替换密码编译错误:char转const char*类型不兼容
CS50第2周替换密码作业编译错误修复
编译代码时触发错误:incompatible integer to pointer conversion passing 'char' to parameter of type 'const char*',错误出现在第36行。核心问题是**strcat函数参数类型不匹配**,同时代码还存在未初始化指针、逻辑错误等问题,以下是具体修复方案:
错误原因分析
strcat参数类型错误:strcat(char *dest, const char *src)要求第二个参数是字符串指针,但代码中直接传递单个char(如key[i]、toupper(key[i])),单个字符属于整数类型,与字符串指针类型不兼容。- 未初始化指针:
keyu、keyl、ct都是未分配内存的空指针,直接调用strcat会导致未定义行为(程序崩溃或内存乱码)。 - 参数检查顺序错误:先检查
lenkey再检查argc,当argc < 2时argv[1]是空指针,调用strlen(key)会触发崩溃。 - 小写密钥逻辑错误:构建
keyl时错误使用toupper,应该用tolower把大写字符转为小写。
修复步骤与完整代码
#include <cs50.h> #include <ctype.h> #include <stdio.h> #include <string.h> int main(int argc, string argv[]) { // 先检查参数数量是否正确 if (argc != 2) { printf("Usage: ./substitution key\n"); return 1; } string key = argv[1]; int lenkey = strlen(key); // 检查密钥长度是否为26 if (lenkey != 26) { printf("Key must contain 26 characters.\n"); return 1; } string pt = get_string("plaintext: "); int len = strlen(pt); // 为密文分配内存:明文长度+1(终止符) char ct[len + 1]; // 初始化密文数组,确保终止符存在 ct[0] = '\0'; // 预分配大小写密钥的内存,26字符+终止符 char keyu[27]; char keyl[27]; keyu[0] = '\0'; keyl[0] = '\0'; // 构建大写密钥 for (int i = 0; i < 26; i++) { char c = key[i]; // 用临时字符串存储单个字符,适配strcat的参数要求 char temp[2]; temp[1] = '\0'; if (isupper(c)) { temp[0] = c; strcat(keyu, temp); } else if (islower(c)) { temp[0] = toupper(c); strcat(keyu, temp); } } // 构建小写密钥 for (int i = 0; i < 26; i++) { char c = key[i]; char temp[2]; temp[1] = '\0'; if (islower(c)) { temp[0] = c; strcat(keyl, temp); } else if (isupper(c)) { temp[0] = tolower(c); strcat(keyl, temp); } } // 生成密文 for (int i = 0; i < len; i++) { char temp[2]; temp[1] = '\0'; if (islower(pt[i])) { temp[0] = keyl[pt[i] - 'a']; strcat(ct, temp); } else if (isupper(pt[i])) { temp[0] = keyu[pt[i] - 'A']; strcat(ct, temp); } else { temp[0] = pt[i]; strcat(ct, temp); } } printf("ciphertext: %s\n", ct); return 0; }
关键修复点说明
- 参数检查顺序调整:先验证
argc是否为2,避免空指针访问。 - 内存分配与初始化:为
keyu、keyl、ct分配足够内存并初始化终止符,避免未定义行为。 - 适配
strcat参数:用长度为2的临时数组temp存储单个字符,添加终止符后作为字符串传递给strcat,解决类型不匹配问题。 - 修正小写密钥逻辑:将
toupper替换为tolower,确保小写密钥生成正确。 - 添加
return语句:错误提示后返回非0值,符合程序退出规范。
内容的提问来源于stack exchange,提问作者Muhammad Bin Shafique
相关产品推荐
相关产品推荐

