繁体   English   中英

不明白为什么C程序崩溃,字符串的指针数组

[英]Don't understand why C program crashes, pointer array of strings

我在使用此for循环时遇到了麻烦,但我不明白为什么它会崩溃。 我正在尝试读取“姓氏姓氏”格式的20个名字的输入列表,并将它们作为字符串存储在“姓氏名”中。 重复项不应存储在数组指针中。

当我注释掉malloc和compare循环时,显然地址保持不变存在一些问题,因此* ary返回的值与* walker相同。 filePtr正常工作,并且strcpy和strcat函数没有问题。 同样,删除第一个printf也会导致程序崩溃,即使删除它似乎除了输出外没有任何实际效果。

FILE *filePtr = fopen ("input.txt","r");
int size = 20;
char **ary;
char **walker;
char **end;
int strsize = 0;
char firstname[30] = {0};
char lastname[30] = {0};
char *fullname;
ary = calloc (size, sizeof(char *));
printf("%d\n",sizeof(pAry));
for ( walker = ary ; *walker < (*end = *ary + size) ; walker++)
{
    fscanf(filePtr," %s",firstname);
    fscanf(filePtr," %[^\n]",lastname);
    strsize = strlen(firstname) + strlen(lastname) + 3;
    fullname = malloc (strsize * sizeof(char));
    strcpy(fullname,lastname);
    strcat(fullname,", ");
    strcat(fullname,firstname);
    for ( compare = 0 ; compare < walker ; compare++)
    {
        if(strcmp(fullname,*(ary + compare)) != 0)
        {
            diff = 0;
        }
    }
    if (diff)
    {
        strncpy(*walker,fullname,strsize);
        printf("%s\n",*walker);
    }
    free(fullname);
}

外循环将遍历ary所有条目,因此结束条件应测试walker是否在end

这里不需要取消引用:

for (walker = ary; walker < (end = ary + size); walker++)

复制品的测试循环会再次比较绝对指针值,将compares初始化为0表示相对compare ,因此该行

compare < walker;

应该

compare < (walker - ary);

减去两个指针将返回一个整数,其大小取决于指针的大小,该大小取决于编译器和/或系统。 为了避免这种不确定性,引入了整数类型ptrdiff_t来保证保留任何指针差。

因此,必须声明compare

ptrdiff_t compare;

如果要比较的字符串相等, strcmp()将返回0 ,因此在不等式上将diff设置为0是错误的。

您可能想使用以下语句来设置diff

    diff = strcmp(fullname,*(ary + compare));

如果两个字符串相等(不* diff * erent),则将diff设置为0 (假)。

在发现欺诈之后,比较也应停止。

    if (!diff)
    {
      break;
    }

最后,需要为每个迭代初始化(重新) diff


代替

    strncpy(*walker, fullname, strsize);

    *walker = fullname;

作为fullname引用新分配的内存,需要存储,如在下一次迭代中覆盖。

fullname free()

  free(fullname);

然后需要将其删除。


将所有这些放在一起,您将获得:

...

for (walker = ary; walker < (end = ary + size); walker++)
{
  ...

  {
    int diff = 1;
    for (ptrdiff_t compare = 0; compare < (walker - ary); compare++)
    {
      diff = strcmp(fullname, *(ary + compare));       
      if (!diff)
      {
        break;
      }
    }

    if (diff)
    {
      *walker = fullname;
      printf("%s\n", *walker);
    }
  }
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM