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