gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:05:53 25 4
gpt4 key购买 nike

与高级语言相比,我在 C 方面的经验要少得多。在 Cisco,我们使用 C,有时我会遇到一些用 Java 或 Python 很容易做,但用 C 很难做的事情。现在就是这样的时代之一。

我有一个动态分配的无符号整数数组,我需要将其转换为以逗号分隔的字符串以进行日志记录。虽然整数不太可能很大,但从概念上讲,它们可以是 0 到 4,294,967,295 之间的任何值。在 Python 中,这是一小段。

my_str = ','.join(my_list)

人们在 C 语言中能多优雅地做到这一点?我想出了一个办法,但很糟糕。如果有人知道这样做的好方法,请赐教。

最佳答案

代码现已在 gcc 下测试和构建。

与其他答案相比,不强制要求使用 C99。

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

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

关于c - 使用 C,尽可能干净地将动态分配的 int 数组转换为逗号分隔的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1745811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com