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

如何用<string.h>的strcat()拼接指针指向的字符串?代码报错咨询

问题分析与修复方案

咱们一步步拆解你代码里的问题:

一、strcat处错误的核心原因

你这里的错误不止一个,是多个问题叠加导致的:

  • 参数类型完全不符:strcat要求两个参数都是char*(指向字符串的指针),但你用*inputchar和*absolutepath把指针解引用成了单个字符,这完全不符合函数的参数要求,编译器直接就会报错。
  • 内存分配严重不足:你只给inputchar和absolutepath分配了1字节的内存(sizeof(char)就是1),别说存文件名和路径了,连字符串必须的结束符'\0'都放不下,后续的输入和拼接操作一定会触发内存越界,属于未定义行为。
  • 指针被错误覆盖导致内存泄漏:你先给absolutepath分配了堆内存,紧接着又把它赋值为字符串常量"D:\\Files\\",这会让之前malloc的内存地址彻底丢失,造成内存泄漏;而且字符串常量是只读的,就算你参数传对了,往里面拼接内容也会触发错误。

二、fopen里用解引用运算符是否正确?

完全错误!fopen的第一个参数需要的是指向路径字符串的指针(const char*类型),inputchar本身就是这个指针,直接传inputchar就行。如果你传*inputchar,本质上是把字符串的第一个字符传进去,这根本不是有效的文件路径,程序肯定无法正确打开文件。

三、修正后的示例代码

我给你改了一份更安全、正确的代码,你可以参考:

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

int main() { 
    // 分配足够的内存,这里假设文件名最多255字节,路径缓冲区留足空间
    char *inputchar = malloc(256); 
    char *absolutepath = malloc(512); 
    FILE *filepointer;

    // 检查内存分配是否成功,避免空指针操作
    if (inputchar == NULL || absolutepath == NULL) {
        perror("malloc failed");
        return 1;
    }

    // 先把基础路径复制到堆内存的absolutepath中
    strcpy(absolutepath, "D:\\Files\\");

    printf("Enter filename: ");
    // 用fgets替代不安全的gets,避免缓冲区溢出
    fgets(inputchar, 256, stdin);
    // 去掉fgets自动读取的换行符
    inputchar[strcspn(inputchar, "\n")] = '\0';

    // 正确拼接字符串:目标是absolutepath,追加inputchar的内容
    strcat(absolutepath, inputchar); 

    // 直接传指针给fopen即可
    filepointer = fopen(absolutepath, "r"); 
    if (filepointer != NULL) {
        // 这里可以添加你需要的文件操作逻辑
        printf("File opened successfully!\n");
        fclose(filepointer);
    } else {
        perror("Failed to open file");
    }

    // 释放堆内存,避免泄漏
    free(inputchar); 
    free(absolutepath); 
    return 0;
}

额外注意事项

  • 永远别用gets,它完全不做缓冲区边界检查,是非常危险的函数,用fgets替代更安全。
  • 每次调用malloc后一定要检查返回值是否为NULL,避免空指针访问崩溃。
  • 字符串拼接前,必须确保目标缓冲区有足够的剩余空间,否则会触发内存越界。
  • 字符串常量是只读的,不要试图修改它们,也别让堆指针被赋值为字符串常量,否则会丢失堆内存地址造成泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:57:20