将文本文件加载到二维数组中,然后与文字进行比较

Load Text File Into 2D Array Then Compare Against Literal

我有二维数组,我想填充然后与文字进行比较

下面是比较代码,我尝试了不同的东西但没有成功

char** list;

load(list);

if(strcmp(list[0], "aasdf"))
{
    printf("win\n");
}

上述 strcmp 上的段错误

加载函数

void load(char **list)
{
int MAX_NUM_LINES = 1000;

FILE *fp;

list = malloc(MAX_NUM_LINES*sizeof(char*));
fp = fopen("list", "r");

line_ct = 0;
char line[256];
while ( fgets(line, 256, fp) != NULL )
{
   int len = strlen(line);
   list[line_ct] = malloc(len * sizeof(char));
   strcpy(list[line_ct], line);
   line_ct++;

   if(line_ct == MAX_NUM_LINES)
   {
        break;
   }
}

fclose(fp);
}

关于段错误的原因有什么想法吗?

我也在strcmp之前试过

printf("Line: %s\n", *list[0]);

它的段错误为

当你从 load 回来时,var list 没有设置,所以当你做

 if(strcmp(list[0], "aasdf"))

您使用 list 时出现未定义的行为(通常是崩溃)


第一个解决方案是使用输出变量

你需要改变

load(list);

来自

load(&list);

并且您需要更改 list 的类型并在 load 中取消引用它,因此:

void load(char ***list)
{
  *list = malloc(MAX_NUM_LINES*sizeof(char*));
  ...
  (*list)[line_ct] = malloc((len + 1) * sizeof(char));
  strcpy((*list)[line_ct], line);

我还在 len 中添加了 1,以便为结束的空字符留出位置。

(edit) *** 的使用不是很常见,正如@user3629249 在评论中所建议的,您可以查看 Triple pointers in C: is it a matter of style? 仔细阅读答案。


第二种解决方案是return分配的数组:

char** list = load();

char ** load()
{
   char **list;
   ...
   return list;

分配每一行时len也加1


除此之外,如果您读取超过 MAX_NUM_LINES 行,您会再次以未定义的行为从数组中写出,并且 load 的调用者不知道如何你读了多少行。

为避免这种情况,您可以先使用 malloc(0) 初始化 list,然后使用 realloc 来增加 [=46] 的大小=]list 每次你读一行,允许分配正确的大小。要向调用者指示大小,您可以使用额外的输出变量或分配一个条目以在最后一个条目中放置 NULL(这一切都取决于您如何在调用 load[=61 的代码中使用读取数组=])