- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
与高级语言相比,我在 C 方面的经验要少得多。在 Cisco,我们使用 C,有时我会遇到一些用 Java 或 Python 很容易做,但用 C 很难做的事情。现在就是这样的时代之一。
我有一个动态分配的无符号整数数组,我需要将其转换为以逗号分隔的字符串以进行日志记录。虽然整数不太可能很大,但从概念上讲,它们可以是 0 到 4,294,967,295 之间的任何值。在 Python 中,这是一小段。
my_str = ','.join(my_list)
人们在 C 语言中能多优雅地做到这一点?我想出了一个办法,但很糟糕。如果有人知道这样做的好方法,请赐教。
最佳答案
与其他答案相比,不强制要求使用 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/
我知道在 KDB 中,如果您有一个列表,例如... l:`apples`oranges`pears` 您可以像下面这样进行 N 次随机选择: 9?l 但是如何尽可能均匀地选择列表中的每个项目? 最佳答
我真的厌倦了它。我有一个高级 Web 应用程序依赖于大量 Javascript 库(jQuery、jQueryUI、OpenLayers、highcharts、EJSChart 等等)。不用说,Int
我是一名优秀的程序员,十分优秀!