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

C语言strcat拼接字符串控制台输出异常,求代码问题定位

问题定位
    1. 未引入strcat对应的头文件
      strcat是<string.h>头文件提供的字符串处理函数,当前代码仅引入了<stdio.h>和<stdlib.h>,属于隐式声明函数,在C标准中属于未定义行为。
    1. strcat调用的目标缓冲区空间不足
      strcat的第一个参数是拼接的目标缓冲区,要求该缓冲区必须有足够的空间容纳拼接后的完整字符串+末尾的\0结束符。你代码中的firstName是通过字符串字面量初始化的字符数组,长度固定为strlen("Omelian") + 1 = 8字节,仅能存储原字符串本身,没有多余空间容纳lastName的内容,直接拼接会导致缓冲区溢出,触发未定义行为,最终输出异常。
    1. 函数返回值类型不匹配
      你定义GetFullName返回值为const char*,但strcat返回的是char*,虽然不会直接导致运行异常,但属于类型不规范的写法。
修复方案

方案1:提前定义足够大的目标缓冲区

#include <stdio.h>
#include <string.h> // 引入字符串处理头文件

const char* GetFullName(char dest[], char firstName[], char lastName[])
{
    strcpy(dest, firstName); // 先把名复制到目标缓冲区
    strcat(dest, lastName); // 再拼接姓
    return dest;
}

int main()
{
    char firstName[] = "Omelian";
    char lastName[] = "Levkovych";
    // 定义足够大的缓冲区,长度是两个字符串长度之和+1存结束符
    char fullName[sizeof(firstName) + sizeof(lastName)];
    GetFullName(fullName, firstName, lastName);
    printf("%s", fullName);
    return 0;
}

方案2:动态申请内存存储拼接结果

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

char* GetFullName(char firstName[], char lastName[])
{
    // 动态申请刚好足够的空间:两个字符串长度之和+1存结束符
    char* dest = (char*)malloc(strlen(firstName) + strlen(lastName) + 1);
    if (dest == NULL) {
        return NULL;
    }
    strcpy(dest, firstName);
    strcat(dest, lastName);
    return dest;
}

int main()
{
    char firstName[] = "Omelian";
    char lastName[] = "Levkovych";
    char* fullName = GetFullName(firstName, lastName);
    if (fullName != NULL) {
        printf("%s", fullName);
        free(fullName); // 释放动态申请的内存,避免内存泄漏
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:18:00