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

C语言实现str1定长前缀插入str2的string_pre函数求助

C语言string_pre函数实现方案

核心实现逻辑

  • 首先通过strlen获取两个输入字符串的原始长度,提前保存str1的原始长度,避免后续修改字符串内容导致长度计算错误
  • 分两个分支处理:
    • 当str2长度小于等于str1长度时:先将原str1需要保留的前(原str1长度 - str2长度)个字符移动到str1偏移str2长度的位置,再将完整str2拷贝到str1起始位置,手动补充字符串结束符\0,返回1
    • 当str2长度大于str1长度时:直接拷贝str2的前原str1长度个字符到str1,手动补充字符串结束符\0,返回0

注意:移动原str1保留片段时使用memmove处理内存重叠场景,避免拷贝内容出错;所有操作完成后必须手动在str1末尾补\0,保证字符串格式合法,长度与原str1一致。

完整可运行代码

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

int string_pre(char *str1, char *str2) {
    int sizeStr1 = strlen(str1);
    int sizeStr2 = strlen(str2);
    int ret;

    if (sizeStr2 <= sizeStr1) {
        int keep_len = sizeStr1 - sizeStr2;
        // 先移动原str1需要保留的片段,避免被str2覆盖
        memmove(str1 + sizeStr2, str1, keep_len);
        // 拷贝str2到str1头部
        memcpy(str1, str2, sizeStr2);
        ret = 1;
    } else {
        // str2更长,仅拷贝前sizeStr1个字符
        memcpy(str1, str2, sizeStr1);
        ret = 0;
    }
    // 固定str1长度,补字符串结束符
    str1[sizeStr1] = '\0';
    return ret;
}

int main() {
    // 测试示例1
    char str1_1[] = "abcdefgh";
    char str2_1[] = "xyz";
    int res1 = string_pre(str1_1, str2_1);
    printf("示例1结果:str1 = %s, 返回值 = %d\n", str1_1, res1);

    // 测试示例2
    char str1_2[] = "abcd";
    char str2_2[] = "efghj";
    int res2 = string_pre(str1_2, str2_2);
    printf("示例2结果:str1 = %s, 返回值 = %d\n", str1_2, res2);

    return 0;
}

运行结果验证

  • 示例1输出:示例1结果:str1 = xyzabcde, 返回值 = 1,符合需求
  • 示例2输出:示例2结果:str1 = efgh, 返回值 = 0,符合需求

代码说明:去掉了原代码中冗余的stdlib.h头文件引用,公共的结束符赋值逻辑抽到分支外,减少重复代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:03:29