我在C语言方面的经验比在高级语言方面要差得多.在Cisco,我们使用C,有时我会遇到一些在Java或Python中很容易做到的事情,但在C中很难做到.现在就是其中之一.
我有一个动态分配的无符号整数数组,我需要转换为逗号分隔的字符串进行日志记录.虽然整数不太可能非常大,但它们在概念上可能是0到4,294,967,295在Python中,这只是一条短线.
my_str = ','.join(my_list)
人们在C中做到这一点有多优雅?我提出了一种方法,但这很糟糕.如果有人知道这样做的好方法,请赐教.
与其他答案相反,不强制要求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