将整数数组转换为C中的字符数组

Convert integer array to character array in C

我需要知道如何在 C 中将整数数组转换为字符数组。 我有 1000 个元素 int 数组,我将有 4000 字节大小的 char 数组。 如何将每个整数元素填充到字符数组中,以便在打印时所有整数都显示在单个字符串中。 例子:dsid_list[3] = {1000, 1001, 1002}; 那么 char_dsid_array 应该有“100010011002” 下面是尝试执行相同操作的代码片段。

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        uint32_t dsid_count = 1000;

        printf("dsid_count:%lu\n",dsid_count);

        uint32_t dsid_list[dsid_count];
        uint32_t i;

        printf("start\n");
        for(i=0; i<dsid_count; i++) {
                dsid_list[i] = i;
        }
        printf("Size of dsid_list:%lu\n", sizeof(dsid_list));

        //char char_dsid_array[sizeof(dsid_list)];
        char *char_dsid_array = (char*)malloc(sizeof(dsid_list) + 1);
        
        i=0;
        char* temp = (char*)malloc(4);
        char* temp1 = char_dsid_array;
        for(i=0; i<dsid_count; i++) {
                sprintf(temp, "%lu", dsid_list[i]);
                if(i == 0) {
                        strcpy(char_dsid_array, temp);
                }
                else {
                        strcat(char_dsid_array, temp);
                }
                char_dsid_array = char_dsid_array + 4;
        }
        char_dsid_array = temp1;
        printf("DSID list: %s\n", char_dsid_array);

        free(char_dsid_array);
        free(temp1);
        free(temp);

        return 0;
}

  • 无论如何,uint32_t 最多可以取值 4294967295 (232 - 1),所以 4字节字符 space 不足以将该数字存储为字符串。

  • 幸运的是,您正在尝试使用 [0..999]

    范围内的数字创建字符串
  • 只需遍历数字并使用 sprintf() 中的 return 值将数字后缀添加到字符串中。 sprintf() (& printf() siblings) returns 成功写入目标的字符数。

// after malloc
    int slen = 0;
    for (int num = 0; num < dsid_count; ++num)
        slen += sprintf (char_dsid_array + slen, "%d", num);

    printf("DSID list: %s\n", char_dsid_array);
  • 但是,如果DSID确实大于number1000,那么你需要分配足够的space,比如10010 (10 x 1001 = 10010) 千字节这样的 ID 更安全。
  • 生成字符串后,如有必要,使用 realloc() 到 trim 未使用的内存,例如:
char* ptr = realloc (char_dsid_array, slen +1);
if (ptr) char_dsid_array = ptr;
else /* error handling */

先生,下面是案例的代码示例:

dsid_list[3] = {1000, 1001, 1002}; Then char_dsid_array should have "100010011002"

请注意一些安全问题,在向数组添加新整数之前,我们必须检查是否有足够的 space,如果 space 足够,我会在连接之前检查:

if(sizeof(my_list) > (strlen(str_number) + strlen(my_list)))

另一个可爱的安全资源是 snprintf,此功能改进了 sprintf 以避免溢出。

这是在线工作代码link

#include <stdio.h>
#include <string.h>

#define INT_CHARS 11 // 5 should be enough, 1000-1999 span 4 digits + '[=10=]', 11 bits are enough for biggest integer number

int main()
{
    int n;
    int length;
    char str_number[INT_CHARS]; // size should enoght to store all digits, null terminator,
    int dsid_list[3] = {1000, 1001, 1002};
    char my_list[4001]= "";

    length = sizeof(dsid_list) / sizeof(int);

    for(n = 0; n < length; n++)
    {
        snprintf(str_number, INT_CHARS, "%d", dsid_list[n]);
        if(sizeof(my_list) > (strlen(str_number) + strlen(my_list)))
        {
            strcat(my_list, str_number);
        }
        else
        {
            printf("Not enough space to store more data\n");
            break;
        }
    }
    printf("my list = %s", my_list);
}

4 个字符足以存储 0 到 999 之间整数的 base-10 字符串表示,但通常它不足以存储任意 int。您可以使用 snprintf 来计算生成字符串表示所需的 space 的数量。我建议在初始化数组时累积所需的大小,然后分配 space 一次。例如:

#include <assert.h>
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
void * xmalloc(size_t s);

int
main(int argc, char **argv)
{
    size_t dsid_count = argc > 1 ? strtol(argv[1], NULL, 10) : 1000;
    size_t needed = 0;
    printf("dsid_count:%zu\n", dsid_count);

    uint32_t *dsid_list = xmalloc(dsid_count * sizeof *dsid_list);
    uint32_t i;

    for( size_t i = 0; i < dsid_count; i+= 1 ){
        dsid_list[i] = i;
        needed += snprintf(NULL, 0, "%" PRIu32, dsid_list[i]);
    }

    char *int_string = xmalloc(needed + 1);
    char *end = int_string;
    size_t avail = needed + 1;

    for( size_t i = 0; i < dsid_count; i+= 1 ){
        int s = snprintf(end, avail, "%" PRIu32, dsid_list[i]);
        end += s;
        avail -= s;
    }
    assert( end - int_string == needed );
    printf("%s\n", int_string);
}


void *
xmalloc(size_t s)
{
    void *rv = malloc(s);
    if( rv == NULL ){
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    return rv;
}
size_t print(char *buff, size_t size, int *array)
{
    size_t pos = 0;
    int len = 0;

    while(size--)
    {
        len = snprintf(buff + (!!buff) * pos, !!buff * INT_MAX, "%d", *array++);
        if(len < 0) { /* error andling */}
        pos += len;
    }
    return pos;
}

char *printIntArray(size_t size, int *array)
{
    char *string = malloc(print(NULL, size, array) + 1);

    if(string) print(string, size, array);
    return string;
}

int main(void)
{
    int array[3] = {1000, 1001, 1002};
    char *b;
    printf("\"%s\"\n", b = printIntArray(3, array));
    free(b);
}