如何在C语言char数组中每3位插入分隔符并返回char指针
功能实现方案
实现逻辑
- 先计算输入数字字符串的长度,长度≤3时不需要插入分隔符,直接返回拷贝结果即可
- 计算需要插入的分隔符总数:
分隔符个数 = (原字符串长度 - 1) / 3,例如示例中8位长度对应(8-1)/3=2个逗号 - 动态申请结果字符串的内存,内存大小为
原长度 + 分隔符个数 + 1,额外1个字节存储字符串结束符\0 - 从后往前遍历原字符串和结果数组,每复制3位数字就插入1个逗号,避免在字符串开头额外多加分隔符
完整代码实现
#include <stdio.h> #include <stdlib.h> #include <string.h> char* insert_divider(char* number) { int origin_len = strlen(number); // 长度小于等于3无需加分隔符,直接返回拷贝 if (origin_len <= 3) { char* res = (char*)malloc(origin_len + 1); strcpy(res, number); return res; } int comma_cnt = (origin_len - 1) / 3; int res_len = origin_len + comma_cnt; char* res = (char*)malloc(res_len + 1); res[res_len] = '\0'; // 提前写入字符串结束符 int origin_idx = origin_len - 1; // 原字符串末尾下标 int res_idx = res_len - 1; // 结果字符串末尾下标 int step = 0; while (origin_idx >= 0) { res[res_idx--] = number[origin_idx--]; step++; // 每3位插入1个逗号,避免在字符串开头插入 if (step == 3 && origin_idx >= 0) { res[res_idx--] = ','; step = 0; } } return res; } // 测试用例 int main() { char number[] = "12000000"; char* result = insert_divider(number); printf("%s\n", result); // 输出 12,000,000 free(result); // 动态申请的内存使用完后需要释放,避免内存泄漏 return 0; }
指针操作说明
你如果习惯纯指针操作而非下标写法,核心遍历逻辑可以替换为下面的写法,和下标操作是完全等价的:
char* origin_p = number + origin_len - 1; char* res_p = res + res_len - 1; int step = 0; while (origin_p >= number) { *res_p-- = *origin_p--; step++; if (step == 3 && origin_p >= number) { *res_p-- = ','; step = 0; } }
注意事项
- 不要直接修改传入的原数组,原数组的存储空间只够存原始数字,没有多余空间存储插入的逗号
- 函数返回的指针指向动态申请的堆内存,调用方使用完后需要调用
free()释放,否则会出现内存泄漏
内容的提问来源于stack exchange,提问作者Mehdi Maazi
相关产品推荐
相关产品推荐

