【问题标题】:How to parse a string array to a function in c [duplicate]如何将字符串数组解析为c中的函数[重复]
【发布时间】:2021-08-03 16:45:15
【问题描述】:

我正在尝试将一个空的字符串数组解析为一个函数,该函数用一些字符串数据填充数组。然后使用该函数之外的字符串数组。

下面是我正在尝试做的示例代码。

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

#define READLENGTH 155
#define READLISTLENGTH 100

void fileReader(char *readBuffer[]) {

  
  for (int i=0;i<100;i++) {
    char buffer[50];
    snprintf(buffer, 20, "hello world %d",i);
    readBuffer[i] = &buffer;
  }
}

int main()
{
    char *readBuffer[READLISTLENGTH];
    fileReader(readBuffer);
    
    for(int i = 0; i < READLISTLENGTH; i++) {
      printf("%s \n",readBuffer[i]);
    }
}

预期的输出是,

hello world 0
hello world 1
hello world 2
     :
     :
hello world 99

但我得到的是,

hello world 99
hello world 99
hello world 99
    :
    :
hello world 99

【问题讨论】:

  • readBuffer[i] = &amp;buffer; 那是存储对局部变量的引用。该变量仅在循环的每次迭代中有效。您需要分配具有超出函数生命周期的动态内存。例如readBuffer[i] = strdup(buffer);。不要忘记当不再需要时需要释放内存。

标签: arrays c function scope c-strings


【解决方案1】:

你声明了一个未初始化的指针数组

char *readBuffer[READLISTLENGTH];

在函数 fileReader 中,您将同一本地数组 buffer 的地址分配给传递数组的元素。

char buffer[50];
snprintf(buffer, 20, "hello world %d",i);
readBuffer[i] = &buffer;

退出函数后,数组的元素将成为无效指针,因为数组buffer 将不再存在。

此外,编译器应该为这个赋值发出一个 nessage

readBuffer[i] = &buffer;

因为操作数的类型不兼容。至少你应该写

readBuffer[i] = buffer;

在任何情况下,您都需要声明一个二维字符数组,例如

char readBuffer[READLISTLENGTH][50];

(在这种情况下应更改函数声明)或在函数fileReader 内,您需要为指针数组的每个元素动态分配内存,并将输入的字符串从本地数组buffer 复制到分配的内存中.

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2017-01-27
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多