如何在C语言中编写接收数字数组并返回空格分隔字符串的函数
C语言数组转空格分隔字符串的正确实现方案
原有代码的核心问题
char s[] = ""仅开辟了1字节的栈内存,后续写入数据属于缓冲区溢出,运行正常是未定义行为的巧合,不是正确实现。- 数组作为函数参数传递时会退化为指针,函数内部无法通过
sizeof计算原数组长度,必须单独传入长度参数。 - 若在函数内定义局部字符数组返回,函数执行结束后栈内存会被回收,返回的地址是野指针,访问必然报错。
long类型使用%d格式化是错误的,正确的格式化符为%ld。
实现方案1:函数内部动态分配内存返回
该方案不需要调用者提前预估缓冲区大小,使用完毕后手动释放内存即可:
#include <stdio.h> #include <stdlib.h> #include <string.h> char* array_to_string(long* arr, size_t arr_len) { // 单块内存预留足够空间:64位long最大19位+1个空格+结尾'\0' size_t need_len = arr_len * 21 + 1; char* res = (char*)malloc(need_len); if (res == NULL) return NULL; res[0] = '\0'; for (size_t i = 0; i < arr_len; i++) { sprintf(res + strlen(res), "%ld ", arr[i]); } // 移除末尾多余的空格 if (strlen(res) > 0) { res[strlen(res) - 1] = '\0'; } return res; } int main() { long a[] = {10, 20, 30, 40}; size_t arr_len = sizeof(a) / sizeof(long); char* str = array_to_string(a, arr_len); if (str != NULL) { printf("array: %s\n", str); free(str); // 必须手动释放动态申请的内存 } return 0; }
实现方案2:调用者传入缓冲区
该方案不需要手动管理内存,安全性更高,适合嵌入式等禁用动态内存的场景:
#include <stdio.h> #include <string.h> void array_to_string(long* arr, size_t arr_len, char* buf, size_t buf_size) { if (buf == NULL || buf_size == 0) return; buf[0] = '\0'; for (size_t i = 0; i < arr_len; i++) { // 校验剩余空间是否足够 if (strlen(buf) + 21 >= buf_size) break; sprintf(buf + strlen(buf), "%ld ", arr[i]); } // 移除末尾多余的空格 if (strlen(buf) > 0) { buf[strlen(buf) - 1] = '\0'; } } int main() { long a[] = {10, 20, 30, 40}; size_t arr_len = sizeof(a) / sizeof(long); char buf[1024] = {0}; // 调用者提前开辟足够大的缓冲区 array_to_string(a, arr_len, buf, sizeof(buf)); printf("array: %s\n", buf); return 0; }
内容的提问来源于stack exchange,提问作者Alexandra Danith Ansley
相关产品推荐
相关产品推荐

