【问题标题】:Create a string from a vector of integers in C从 C 中的整数向量创建一个字符串
【发布时间】:2020-01-02 07:13:02
【问题描述】:

我正在尝试从向量创建一个字符串,如下所示: 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) vector[0]; 不是将整数转换为字符串的正确方法。考虑使用sprintf
  • 与其尝试使用str[i+...] 操作字符串,不如考虑使用strcat 来构建字符串。这也将处理您错过的最后的 nul 终止符。
  • 或使用来自snprintf()(或sprintf())的返回值,它告诉您向字符串添加了多少个字符,不包括尾随的空值。

标签: c string int


【解决方案1】:

您的代码有几个问题 -

  1. 您使用的是" 而不是'" 用于创建char* 类型的字符串文字。因此你得到的错误。
  2. (char) vector[0]; 不是将整数转换为字符串的正确方法。你应该使用sprintf之类的东西。
  3. 您没有通过调用calloc(方括号、逗号、空格、nul 终止符)分配足够的内存。
  4. 您只是在缓冲区中填充某些字符。其余的被初始化为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

【讨论】:

    【解决方案2】:

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

    所以

    str[0] = "[";
    

    应该是

    str[0] = '[';
    

    对于所有其他任务也是如此。

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

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

    其他问题:您只是将vector 的每个第三个元素放入字符串中。您需要为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] = '\0';
            }
        }
    
        printf("%s\n", str);
    }
    

    【讨论】:

      【解决方案3】:

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

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

      ...也许是这样的(未编译/未经测试):

      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);
      

      【讨论】:

      • *s++ = "["; 无法编译。 int i=1; --> int i=0; vector[i] + 0x30 --> vector[i] + '0'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多