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
相关产品推荐
相关产品推荐

