将整数数组转换为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);
}
我需要知道如何在 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);
}