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

C语言如何向字符串追加字符?使用strcat报错invalid initializer怎么解决?

问题解决方案

报错根因

  • 直接触发编译错误的是char tempC[2] = c;写法:C语言不支持用单个字符变量直接初始化字符数组,数组初始化需要匹配对应数据结构,同时参与strncat运算的字符串必须以\0结尾,你这里没有设置结束符也会导致运行异常。
  • 代码还存在多个隐藏问题:
    • fp、filename、c变量未声明,其中c必须声明为int类型,因为getc返回值为int,只有int类型才能正确容纳EOF标识
    • 缺少文件打开失败的判断逻辑
    • box数组长度仅为100,未做越界防护,读取文件内容过长会触发内存越界
    • 读取文件后未调用fclose关闭文件句柄,会造成资源泄漏

修正后可运行代码

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

int main() {
    char box[100] = "";
    // 替换为你实际要读取的文件路径
    const char* filename = "test.txt";
    FILE* fp = fopen(filename, "r");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }
    int c;
    size_t cur_len = 0;
    // 最多读取99个字符,留1位存结束符
    for (c = getc(fp); c != EOF && cur_len < 99; c = getc(fp)) {
        char tempC[2];
        tempC[0] = c;
        tempC[1] = '\0';
        strncat(box, tempC, 1);
        cur_len++;
    }
    fclose(fp);
    printf("读取结果:%s\n", box);
    return 0;
}

优化方案(无需调用strncat)

直接操作数组下标赋值即可实现相同效果,性能更高逻辑更简洁:

// 循环部分可替换为如下代码
size_t idx = 0;
for (c = getc(fp); c != EOF && idx < 99; c = getc(fp)) {
    box[idx++] = c;
}
box[idx] = '\0';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:06:02