当前位置:  开发笔记 > 编程语言 > 正文

使用C,将动态分配的int数组尽可能干净地转换为逗号分隔的字符串

如何解决《使用C,将动态分配的int数组尽可能干净地转换为逗号分隔的字符串》经验,为你挑选了1个好方法。

我在C语言方面的经验比在高级语言方面要差得多.在Cisco,我们使用C,有时我会遇到一些在Java或Python中很容易做到的事情,但在C中很难做到.现在就是其中之一.

我有一个动态分配的无符号整数数组,我需要转换为逗号分隔的字符串进行日志记录.虽然整数不太可能非常大,但它们在概念上可能是0到4,294,967,295在Python中,这只是一条短线.

my_str = ','.join(my_list)

人们在C中做到这一点有多优雅?我提出了一种方法,但这很糟糕.如果有人知道这样做的好方法,请赐教.



1> Jed Smith..:

代码现在在gcc下测试和构建.

与其他答案相反,不强制要求C99.

这里真正的问题是不知道你需要的字符串的长度.获取数字就像sprintf("%u", *num)使用num数组一样简单int,但是你需要多少空间?为避免超出缓冲区,您必须跟踪大量整数.

size_t join_integers(const unsigned int *num, size_t num_len, char *buf, size_t buf_len) {
    size_t i;
    unsigned int written = 0;

    for(i = 0; i < num_len; i++) {
        written += snprintf(buf + written, buf_len - written, (i != 0 ? ", %u" : "%u"),
            *(num + i));
        if(written == buf_len)
            break;
    }

    return written;
}

请注意,我记录了我使用和使用的缓冲区的数量,snprintf因此我不会超出结束范围. snprintf将钉在一个\0,但因为我使用buf + written我会在开始\0前一个的snprintf.

正在使用:

int main() {
    size_t foo;
    char buf[512];

    unsigned int numbers[] = { 10, 20, 30, 40, 1024 };

    foo = join_integers(numbers, 5, buf, 512);
    printf("returned %u\n", foo);
    printf("numbers: %s\n", buf);
}

输出:

returned 20
numbers: 10, 20, 30, 40, 1024

强制限制开始,而不是超越:

char buf[15];    
foo = join_integers(numbers, 5, buf, 14);
buf[14] = '\0';

预计产出:

returned 14
numbers: 10, 20, 30, 4

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有