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

时间:2019-06-29 07:22:07

标签: c fgets strcmp

我有要填充的2D数组,然后与文字进行比较

下面是比较代码,我尝试不同的方法都没有成功

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

发生段错误

1 个答案:

答案 0 :(得分:1)

当您从 load 返回时,未设置var list ,因此当您这样做时

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

您使用 list 具有不确定的行为(通常是崩溃)


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

您需要更改

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,以放置结尾的空字符。

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


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

char** list = load();

使用

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

在分配每行时还将 len 加1


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

为避免这种情况,您可以先使用malloc(0)初始化 list ,然后每次使用 realloc 来增加 list 的大小。读取一行,可以分配正确的大小。为了向调用者指示大小,您可以使用附加的输出var或分配一个以上的条目以在最后一个条目中放置NULL(这取决于您在调用 load 的代码中使用read数组的方式)