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

2024-01-08

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

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

my_str = ','.join(my_list)

人们可以用 C 语言多么优雅地做到这一点?我想到了一个办法,但是很糟糕。如果有人知道一个好方法,请赐教。


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

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

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

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐