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

C语言字符串每N个字符插入分隔符的逻辑错误排查与优化咨询

原始代码错误原因

  • 你错误使用输出缓冲区的索引i作为分块判断依据:i是输出字符串的下标,包含了你后续插入的短横线,计数规则和输入字符的序号完全不匹配,自然会出现分块错位
  • 判断逻辑时机错误:你是在写入第i个输出字符后判断i%7==0,此时已经多写入了1个输入字符,导致第一个块长度变成了8位,后续块也跟着错位

你提交的修复版本存在的问题

  • 输入内存申请错误:malloc(22 * sizeof(char*)) 这里你申请的是22个指针大小的内存,正确应该是malloc(22 * sizeof(char)),在64位系统下会直接导致内存溢出
  • 没有处理边界情况:如果输入长度刚好是7的倍数,代码会在字符串末尾多插入一个多余的短横线
  • 输出字符串没有手动补\0,会导致打印输出时出现乱码
  • 硬编码了i<22的判断,不支持任意长度的输入

更简洁的通用实现

首先计算输出所需内存长度:假设输入字符串长度为len,输出长度为 len + (len - 1)/7 + 1(加1是存储结束符\0),实现代码如下:

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

char* split_by_7(const char* input) {
    int len = strlen(input);
    // 计算输出需要的内存大小
    int output_len = len + (len - 1)/7 + 1;
    char* output = (char*)malloc(output_len * sizeof(char));
    if (!output) return NULL;
    
    int in_cnt = 0, out_idx = 0;
    while (*input) {
        output[out_idx++] = *input++;
        in_cnt++;
        // 每满7个输入字符,且不是最后一个字符的情况下加短横线
        if (in_cnt % 7 == 0 && *input != '\0') {
            output[out_idx++] = '-';
        }
    }
    output[out_idx] = '\0';
    return output;
}

// 测试用例
int main() {
    const char* input = "012345678901234567890";
    char* res = split_by_7(input);
    printf("input is %s\noutput is %s\n", input, res);
    free(res);
    return 0;
}

该实现适配任意长度的输入,不需要硬编码缓冲区大小,自动规避末尾多余短横线的问题,内存申请大小计算准确,不会出现溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:09:04