【问题标题】:In C89, I can't seem to make a character array from an existing one在 C89 中,我似乎无法从现有字符数组中创建字符数组
【发布时间】:2018-10-15 17:22:57
【问题描述】:

所以我的代码在 buffer[i] = envp[i] 处崩溃。

我想创建环境变量的 char**buffer,并将它们设为小写(尚未添加 putc(tolower()) 循环)。但是当我尝试制作 buffer[i] = envp[i] 时,编译器会返回这个错误:

错误:赋值从没有强制转换的指针生成整数 [-Wint-转换] 缓冲区[i] = envp[i]; ^

警告:格式“%s”需要“char *”类型的参数,但参数 2 具有“int”类型 [-Wformat=] printf("%s\n", 缓冲区[i]); ~^ ~~~~~~~~~ %d

int main(int argc, char *argv[], char * envp[])
{
    int i = 0;

    char *buffer = NULL;

    while(envp[i])
    {
        i++;
    }

    buffer = (char *)malloc(i * 8);


    for (i = 0; envp[i] != 0 ; i++)
    {
        buffer[i] = envp[i];
        printf("%s\n", envp[i]);
        printf("%s\n", buffer[i]);
    }

    return 0;

}

请帮忙,我一直在这里打破我的头:(。非常感谢!!!

【问题讨论】:

  • 鉴于char *buffer,你认为buffer[i]是什么?
  • 即使将buffer 更改为char * 的序列而不是现在的char,除了来自evp[] 的指针之外,没有任何内容被复制。简而言之,它是复制。最初您有一组指向这些字符串的指针(在evp[] 中),现在您将有两个(在evp[]buffer[] 中)。我有点怀疑这对你有多大帮助。
  • @WhozCraig True 关于数组的重复。注意修复的buffer[] 仍然依赖envp[] 来知道buffer[] 中有多少是有效的。我希望 buffer[]NULL 大 1 个元素。
  • @chux 或做一些勇敢的事情,称我为疯子,保留字符串数 除了i 或枚举envp 再次.

标签: c c89


【解决方案1】:

buffer 不是保存字符串数组的正确类型。应该定义为:

char **buffer;

另外,你应该malloc如下:

buffer = malloc(i * sizeof(*buffer));

显式使用sizeof(*buffer) 而不是幻数8,因为不能保证指针为8 字节。这也比sizeof(char *) 更受欢迎,因为它不依赖于buffer 的类型还有don't cast the return value of malloc

由于env 被一个NULL 指针终止,您需要对buffer 执行相同的操作。您还应该使用 strdup 复制字符串,而不仅仅是复制指针,以便您可以处理单独的副本:

char **buffer = malloc((i+1) * sizeof(*buffer));

for (i = 0; envp[i] != 0 ; i++)
{
    buffer[i] = strdup(envp[i]);
    printf("%s\n", envp[i]);
    printf("%s\n", buffer[i]);
}
buffer[i] = NULL;

【讨论】:

    【解决方案2】:

    char * envp[] 是指向字符的指针数组,而不是字符数组。并且指针 (envp[i]) 是一个整数。当您尝试将其分配给 buffer[i](这是一个字符)时,您会收到警告。

    【讨论】:

      【解决方案3】:

      感谢大家的反馈,在这里的 cmets 之后,我能够修复我的功能。为帮助干杯!!!

      char **lower_env(int argc, char *argv[], char * envp[])
      {
          int i = 0;
          int k = 0;
          int length = 0; /*Going to dictate lengths later on*/
      /*creating the double buffer*/
      char **buffer;
      
      /* Finding the amount of elements in the environment array*/
      while (envp[i])
      {
          i++;
      }
      
      /* Allocate the memory for the Buffer to hold that amount of elements*/
      buffer = calloc(i+1, (sizeof(char*)));
      
      
      for (i = 0; envp[i] ; i++)
      {
      
          length = strlen(envp[i]); /*Finding the length of each array pointed
                                      at by the original environment array*/
      
          buffer[i] = calloc(length+1 , sizeof(char)); /*Allocating that memory space
                                                              within our buffer array*/
      
      
          /*copying over the arrays in lowercase pointed at by the env array to a new memory location
              pointed at by our new buffer array*/
          for (k = 0; k != length; k++)
          {
              buffer[i][k] = tolower (envp[i][k]);
          }
      }
      
      return buffer;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 1970-01-01
        • 2021-01-15
        • 2012-11-26
        • 1970-01-01
        相关资源
        最近更新 更多