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

标签 c arrays string pointers for-loop

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

当我注释掉 malloc 和比较循环时,显然地址保持不变存在一些问题,因此 *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++)
<小时/>

重复项的测试循环确实与绝对指针值进行比较,compare 初始化为 0 意味着相对比较,因此这一行

compare < walker;

应该是

compare < (walker - ary);

两个指针相减返回一个整数,其大小取决于指针的大小,而指针的大小因编译器和/或系统而异。为了解决这种不确定性,引入了整数类型 ptrdiff_t 来保证保存任何指针差异。

因此应声明比较:

ptrdiff_t compare;
<小时/>

strcmp() 如果要比较的字符串相等,则返回 0,因此将 diff 设置为 0关于不平等的说法是错误的。

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

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

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

在发现欺骗行为后,比较也应停止。

    if (!diff)
    {
      break;
    }

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

<小时/>

而不是

    strncpy(*walker, fullname, strsize);

    *walker = fullname;

as fullname 指的是新分配的内存,需要存储,并在下一次迭代中覆盖。

free()ing fullname

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

关于c - 不明白为什么C程序崩溃,字符串指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18039699/

相关文章:

java - 高级语言(例如Java)和汇编语言之间的关系?

c - C中结构的详细教程

javascript - 嵌套数组上的递归过滤器

c++ - isdigit 无法正常工作

有人可以帮我检测下一个代码中的错误吗?关于 c 中的字符串

python - Easy Python Function——为什么我会得到这么多错误?

无法在 gdb 中的 printf 语句后运行调试

我们可以将一个结构的对象用作另一个结构或 union 的成员吗?

java - 3 维数组中带有嵌套 for 循环的整数

arrays - 搜索哈希数组以查看给定哈希中的特定元素是否与 Ruby 中另一个数组中的任何字符串匹配