代码现已在 gcc 下进行测试和构建。
与其他答案相反,不强制要求 C99。
这里真正的问题是不知道您需要的字符串的长度。获取号码就像sprintf("%u", *num)
using 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
.
In use:
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);
}
Outputs:
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