从 C 中的整数向量创建一个字符串

Create a string from a vector of integers in C

我正在尝试从向量创建一个字符串,如下所示: int vector[3] = {1, 2, 3}.

那么,我得到的字符串应该是: [1, 2, 3] 存储在一些 char[] 变量中。

我试着像下面这样动态地做:

void print_vector(int *vector, int lon){
    char *str = (char*)calloc(3*lon, sizeof(char));
    str[0] = "[";
    str[1] = (char) vector[0];

    for(int i = 1; i < lon; i += 3){
        str[i] = (char)vector[i];
        if(i != lon - 1){
            str[i + 1] = (char)",";
            str[i + 2] = " ";
        }else{
            str[i + 1] = "]";
        }
    }

    printf("%s\n", str);
}

其中 lon 是向量的长度,但我从编译器那里收到此警告:

警告:从 "char *" 到 "char" 的赋值从指针创建一个整数,无需转换 [-Wint-conversion]

我做错了什么?谢谢

您正在尝试将字符串分配给 char 数组元素。您需要使用单引号来创建 char 个常量。

所以

str[0] = "[";

应该是

str[0] = '[';

所有其他作业也类似。

另一个问题是(char)vector[i]不会returnvector[i]中数字的字符表示。它只是使用整数作为字符代码。因此,如果 vector[i] 为 1,则生成 '',而不是 '1'。获取数字字符表示的方法是 '0' + vector[i].

最后,您需要在字符串末尾添加一个空终止符,以便您可以使用 %s 格式打印它。您应该在 returning 之前释放它以防止内存泄漏。

其他问题:您只是将 vector 的每个第 3 个元素放入字符串中。您需要为 vectorstr 使用单独的索引。数组索引从 0 开始,而不是 1.

void print_vector(int *vector, int lon){
    char *str = (char*)calloc(3*lon, sizeof(char));
    str[0] = "[";
    str[1] = (char) vector[0];

    for(int i = 0; i < lon; i++){
        str[i*3] = '0' + vector[i];
        if(i != lon - 1){
            str[i*3 + 1] = ',';
            str[i*3 + 2] = ' ';
        }else{
            str[i*3 + 1] = ']';
            str[i*3 + 2] = '[=12=]';
        }
    }

    printf("%s\n", str);
}

假设向量中的每个元素都是一个数字,并且每个元素的间距相同...

...并记住您需要在末尾分配一个空字节来终止您的字符串...

...也许是这样的 (uncompiled/untested):

void print_vector(int *vector, int lon){
    char *str = (char*)calloc((3*lon)+1, sizeof(char));
    char *s = str;
    *s++ = "[";
    int i=1;
    while (i < lon) {
      *s++ = vector[i] + 0x30;  // ASCII "0"= 0x30, "1"= 0x31, ...
      *s++ = ',';
      *s++ = ' ';
      i++;
    }   
    s -= 2;
    *s++ = ']';
    *s++ = 0;
    printf("%s\n", str);

您的代码存在几个问题 -

  1. 您正在使用 " 而不是 '" 用于创建类型为 char* 的字符串文字。因此你得到的错误。
  2. (char) vector[0]; 不是将整数转换为字符串的正确方法。你应该使用像 sprintf.
  3. 这样的东西
  4. 调用 calloc(方括号、逗号、space、空终止符)时,您没有分配足够的内存。
  5. 您只是在填充缓冲区中的某些字符。其余初始化为0。这将导致字符串比预期提前终止。

首先,您可以将代码修改为 -

void print_vector(int *vector, int lon){

    char *str = calloc(5*lon+3, sizeof(char)); 
    // 5 for each character (3 characters per integer + space + comma. 
    // Two brackets and nul-terminator

    strcpy(str, "[");

    if (lon) {
        sprintf(str+1, "%d", vector[0]);
        for(int i = 1; i < lon; i++){
            sprintf(str + strlen(str), ", %d", vector[i]);
        }
    }

    strcat(str, "]");

    printf("%s\n", str);
}

您可以找到工作演示 here on ideone