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

CS50无元音编程题:strcat函数参数类型不匹配报错求助

CS50无元音编程题报错分析与修复

错误原因

编译器报错的核心是类型不匹配:strcat函数的第二个参数要求是const char*(指向以\0结尾的字符串的指针),但你在else分支里传递的是单个char(word[i]或变量p)。char本质是8位整数类型,和指针类型无法直接转换,因此触发类型转换错误。

修复方案

这里提供两种可行的修复方式:

方案1:临时字符串适配strcat要求

为单个字符创建一个包含终止符的临时字符串,再传给strcat:

else
{
    char temp_str[2];
    temp_str[0] = word[i];
    temp_str[1] = '\0'; // 必须添加字符串终止符,否则strcat会读取内存垃圾
    strcat(new, temp_str);
}

方案2:手动管理数组索引(更高效推荐)

每次调用strcat都会遍历目标字符串找末尾,效率较低。可以直接用索引跟踪new数组的写入位置,手动赋值:

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    string word = get_string("Give me a word: " );
    int len = strlen(word);
    int i;
    int new_pos = 0; // 记录new数组当前写入的位置
    char new[len + 1];

    for (i = 0; i < len; i++)
    {
        if (word[i] == 'e')
        {
            new[new_pos++] = '3';
        }
        else if (word[i] == 'i')
        {
            new[new_pos++] = '1';
        }
        else if (word[i] == 'a')
        {
            new[new_pos++] = '6';
        }
        else if (word[i] == 'o')
        {
            new[new_pos++] = '0';
        }
        else
        {
            new[new_pos++] = word[i];
        }
    }
    new[new_pos] = '\0'; // 最后必须添加字符串终止符,否则printf会输出垃圾内容
    printf("%s\n", new);
}

这种方式不需要依赖strcat,逻辑更直接,性能也更好。

额外注意

原代码中new数组初始化时设置new[0] = '\0';是正确的(保证初始是一个空字符串),但如果用方案2,就不需要这个初始化,直接通过new_pos从0开始赋值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:42:44