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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:00:04