如何将整型数组转换为字符串数组

7

我有一个整数数组:

int a[5]={5,21,456,1,3}

我需要将这些数字存储到char数组中,使得该数组看起来像这样:

char *s="52145613";

中是否有此功能的库函数?


2
如果您将其存储为没有分隔符的这种方式,之后您将无法解释它。 - amdixon
1
char str[100]; sprintf(str, "%d%d%d%d%d", a[0], a[1], a[2], a[3], a[4]); - Spikatrix
我花了一秒钟才明白@CoolGuy的答案是正确的。如果数组大小可变,创建一个循环并连接字符串。 - qwerty_so
@Zain,我对这个问题很感兴趣,但(指amdixon)我更喜欢将字符串保存为“[5,21,456,1,3]”。这是你想要的吗?-否则-你想将整数连接成“一个单一的数字”的原因是什么?(以字符串格式。) - Henke
5个回答

17

sprintf 可以满足你的需求。

以下是一个小例子:

char str[128];
int i=0;
int index = 0;
for (i=0; i<5; i++)
   index += sprintf(&str[index], "%d", a[i]);

snprintf 负责处理字符串的长度

char str[128];
int i=0;
int index = 0;
for (i=0; i<5; i++)
   index += snprintf(&str[index], 128-index, "%d", a[i]);

@WoodrowBarlow 是的,我编辑了。 - LPs
2
请注意,snprintf() 在出现错误的情况下会返回负值。将此值添加到 index 中是错误的。 - scai
如果结果字符串中的数字位数>128,则此方法无法工作。 - Fremzy

4

你需要做的是将a中的整数值转换为字符值,留出一个空间放置空字符以终止字符串。在您的情况下,总共需要9个字符。由于这些值超过了单个数字,因此sprintf是正确的工具:

#include <stdio.h>

int main(void)
{
    int a[5]={5,21,456,1,3};
    char s[9] = {0};
    int n = 0;

    for (int i = 0; i < 5; i++) {
        n += sprintf (&s[n], "%d", a[i]);
    }

    printf ("\n char* s = %s\n\n", s);

    return 0;
}

输出

$ ./bin/sprintf

 char* s = 52145613

明白了——还没喝咖啡——正在清除答案。 - David C. Rankin

3

尝试采用更易读的方法,尽管其他答案在内存和指令方面更有效。

这里进行了测试。

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

void get_me_a_string(int * int_array, int array_size, char * output_string, int output_string_max_size)
{
    if(!int_array || !output_string)
        return;

    char * aux_string = NULL;

    //Depending on the compiler int is 2-byte or 4 byte.
    //Meaning INT_MAX will be at most 2147483647 (10 characters + 1 '\0').
    aux_string = (char *) malloc(11);
    if(!aux_string)
        return;

    int i;
    int current_array_size = 0;
    for(i = 0; i < array_size; i++)
    {
        sprintf(aux_string, "%d", int_array[i]);
        current_array_size += strlen(aux_string);
        if(current_array_size < output_string_max_size)
            strcat(output_string, aux_string);
        else
            break;
    }

    free(aux_string);
}

int main(void) {
    int a[5]={5,21,456,1,3};

    int string_max_size = 256;
    char * string_from_array = NULL;

    string_from_array  = (char *) malloc(string_max_size);

    if(NULL == string_from_array)
    {
        printf("Memory allocation failed. Exiting...");
        return 1;
    }

    memset(string_from_array, 0, string_max_size);
    get_me_a_string(a, 5, string_from_array, string_max_size);

    printf(string_from_array);

    free(string_from_array);
    return 0;
}

这可以通过使string_max_size动态化来进一步扩展,string_max_size = sizeof(a) / sizeof(a[0]*11; - Fremzy

1
你可以搜索sprintf()/ snprintf(),这些函数能够完成你的工作。
从手册中可以得知,

int sprintf(char *str, const char *format, ...); int snprintf(char *str, size_t size, const char *format, ...);

printf()家族中的函数根据下面描述的格式生成输出。...[...]...

sprintf()snprintf()vsprintf()vsnprintf()写入字符字符串str


0
这里有一个演示程序,展示了如何实现这个功能。
#include <stdio.h>

int main(void) 
{
    int a[] = { 5, 21, 456, 1, 3 };
    const size_t N = sizeof( a ) / sizeof( *a );
    char s[10];
    int n;

    for ( size_t i = 0, j = 0; 
          i < N && ( n = snprintf( s + j, sizeof( s ) - j, "%d", a[i] ) ) > 0;
          i++ )
    {
        j += n;
    }        

    puts( s );

    return 0;
}

程序输出为

52145613

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接