C语言实现字符串数组元素添加与逗号分隔拼接功能问题
C语言字符串数组操作函数实现
以下是两个需求函数的可直接使用的实现,可适配常规的固定代码框架,若参数签名与你现有框架不一致,仅需调整参数名/遍历逻辑即可。
前置依赖
需提前引入以下头文件:
#include <stdio.h> #include <stdlib.h> #include <string.h>
1. addNameToList 实现
函数功能
遍历字符串数组找到第一个NULL空闲槽位,为传入名字分配堆内存后挂载到该槽位,无空闲槽位/参数非法/内存分配失败时不修改原数组。
实现代码
void addNameToList(char** list, int listMaxLen, const char* name) { // 非法参数直接返回 if (list == NULL || listMaxLen <= 0 || name == NULL) { return; } // 遍历查找第一个空闲槽位 for (int i = 0; i < listMaxLen; i++) { if (list[i] == NULL) { size_t nameLen = strlen(name); // 分配内存,预留\0的空间 char* nameBuf = (char*)malloc(nameLen + 1); if (nameBuf == NULL) { return; } strncpy(nameBuf, name, nameLen); // 手动补\0,避免strncpy边界场景下未自动补结束符的问题 nameBuf[nameLen] = '\0'; list[i] = nameBuf; return; } } // 无空闲槽位,无操作 }
2. printListToString 实现
函数功能
跳过数组中NULL元素,将所有非空字符串用, 分隔拼接为完整字符串存入目标缓冲区,保证以\0结尾,返回缓冲区指针支持链式调用。
实现代码
char* printListToString(const char** list, int listLen, char* buf, size_t bufSize) { // 非法参数处理 if (list == NULL || listLen <= 0 || buf == NULL || bufSize == 0) { if (buf != NULL && bufSize > 0) { buf[0] = '\0'; } return buf; } // 初始化缓冲区为空 buf[0] = '\0'; size_t remainSpace = bufSize; // 标记是否是第一个非空元素,不需要前缀分隔符 int isFirst = 1; for (int i = 0; i < listLen; i++) { if (list[i] == NULL) { continue; } const char* prefix = isFirst ? "" : ", "; size_t prefixLen = strlen(prefix); size_t strLen = strlen(list[i]); // 校验剩余空间是否足够 if (remainSpace < prefixLen + strLen + 1) { break; } // 拼接分隔符 strncat(buf, prefix, remainSpace - 1); remainSpace -= prefixLen; // 拼接字符串 strncat(buf, list[i], remainSpace - 1); remainSpace -= strLen; isFirst = 0; } // 强制补结束符,避免缓冲区溢出 buf[bufSize - 1] = '\0'; return buf; }
注意事项
- 若你的现有框架中字符串数组以末尾NULL元素作为结束标识(无需传入数组长度参数),将遍历终止条件修改为
list[i] != NULL即可。 - 程序退出前需遍历释放数组中所有非空元素的堆内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Sentenza_IV
相关产品推荐
相关产品推荐

