gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:46:46 25 4
gpt4 key购买 nike

我在使用这个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com