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

如何在C语言的字符串数组中替换指定字符串?

问题分析与解决方案

你遇到的核心问题有两个:

  1. char *words[3]里的元素指向的是字符串字面量,这类数据存储在只读内存区域,根本不允许修改,直接用strcpy写入会触发未定义行为。
  2. 就算忽略只读限制,"dog"的内存空间仅4字节(含结束符\0),而"mouse"需要6字节,空间不足必然导致内存越界。

下面是两种可行的解决方法:

方法1:直接替换指针(最简单高效)

因为words是指针数组,直接让目标元素指向新字符串的内存地址即可。注意如果word[]是局部变量,要关注它的生命周期:

#include <stdio.h>

int main() {
    char *words[3] = {"cat", "dog", "bird"};
    char word[] = "mouse";
    
    // 替换数组中对应"dog"的元素(words[1])
    words[1] = word;
    
    // 验证结果
    for (int i = 0; i < 3; i++) {
        printf("%s\n", words[i]);
    }
    return 0;
}

注意:如果word是局部变量,当它所在函数执行完毕后,words[1]会变成野指针。如果需要长期保存字符串,建议用动态分配内存的方式。

方法2:动态分配内存(适合长期存储)

通过malloc分配足够的内存空间,再复制字符串内容,避免局部变量生命周期问题:

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

int main() {
    char *words[3] = {"cat", "dog", "bird"};
    char word[] = "mouse";
    
    // 分配能容纳"mouse"的内存(长度+1是为了存储结束符'\0')
    words[1] = malloc(strlen(word) + 1);
    if (words[1] == NULL) {
        perror("内存分配失败");
        return 1;
    }
    strcpy(words[1], word);
    
    // 验证结果
    for (int i = 0; i < 3; i++) {
        printf("%s\n", words[i]);
    }
    
    // 记得释放动态分配的内存,避免泄漏
    free(words[1]);
    return 0;
}

注意:如果原words元素是动态分配的,替换前必须用free释放旧内存;但如果是字符串字面量,绝对不能调用free,否则会导致程序崩溃。

额外提醒

  • 字符串字面量本质是只读常量,永远不要尝试修改它们,这是C语言的基础规则。
  • 指针数组的核心是存储地址,替换指针比修改内存内容更安全高效,只要注意内存的生命周期即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:46:04