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

CS50 Week2替换密码编译错误:char转const char*类型不兼容

CS50第2周替换密码作业编译错误修复

编译代码时触发错误:incompatible integer to pointer conversion passing 'char' to parameter of type 'const char*',错误出现在第36行。核心问题是**strcat函数参数类型不匹配**,同时代码还存在未初始化指针、逻辑错误等问题,以下是具体修复方案:

错误原因分析

  1. strcat参数类型错误:strcat(char *dest, const char *src)要求第二个参数是字符串指针,但代码中直接传递单个char(如key[i]、toupper(key[i])),单个字符属于整数类型,与字符串指针类型不兼容。
  2. 未初始化指针:keyu、keyl、ct都是未分配内存的空指针,直接调用strcat会导致未定义行为(程序崩溃或内存乱码)。
  3. 参数检查顺序错误:先检查lenkey再检查argc,当argc < 2时argv[1]是空指针,调用strlen(key)会触发崩溃。
  4. 小写密钥逻辑错误:构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:35:35