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

