Don';我不明白为什么C程序会崩溃,指针数组是字符串
我遇到了这个for循环的问题,我不明白为什么它会崩溃。我正在尝试读取一个输入列表,其中有20个名字是“first name last name”格式的,并将它们作为字符串存储在“last name,first name”中。不应将重复项存储到数组指针中 当我注释掉malloc和compare循环时,显然地址保持不变存在一些问题,因此*ary返回与*walker相同的值。filePtr工作正常,strcpy和strcat功能没有问题。此外,删除第一个printf也会导致程序崩溃,即使删除它除了输出之外似乎没有任何实际效果Don';我不明白为什么C程序会崩溃,指针数组是字符串,c,arrays,string,pointers,for-loop,C,Arrays,String,Pointers,For Loop,我遇到了这个for循环的问题,我不明白为什么它会崩溃。我正在尝试读取一个输入列表,其中有20个名字是“first name last name”格式的,并将它们作为字符串存储在“last name,first name”中。不应将重复项存储到数组指针中 当我注释掉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);
}
FILE*filePtr=fopen(“input.txt”、“r”);
int size=20;
字符;
查尔**沃克;
字符**结束;
int strsize=0;
char firstname[30]={0};
char lastname[30]={0};
字符*全名;
ary=calloc(大小,大小(字符*);
printf(“%d\n”,sizeof(pAry));
对于(walker=ary;*walker<(*end=*ary+size);walker++)
{
fscanf(filePtr,“%s”,firstname);
fscanf(filePtr,“%[^\n]”,lastname);
strize=strlen(firstname)+strlen(lastname)+3;
全名=malloc(strize*sizeof(char));
strcpy(全名、姓氏);
strcat(全名,“,”);
strcat(全名、名);
for(compare=0;compare
外部循环应在ary
的所有条目上循环,因此结束条件应测试walker
是否在结束处
此处不需要解引用:
for (walker = ary; walker < (end = ary + size); walker++)
应该是
compare < (walker - ary);
strcmp()
如果要比较的字符串相等,则返回0
,因此将diff
设置为0
不相等是错误的
您可能希望使用以下语句来设置diff
:
diff = strcmp(fullname,*(ary + compare));
如果两个字符串a相等(而不是*diff*erent),则将diff
设置为0
(false)
此外,在发现复制品后,应停止比较
if (!diff)
{
break;
}
最后,每次迭代都需要(重新)初始化diff
而不是
strncpy(*walker, fullname, strsize);
做
asfullname
指的是新分配的内存,需要存储,在下一次迭代中被覆盖
行free()
ingfullname
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);
}
}
}
。。。
对于(walker=ary;walker<(end=ary+大小);walker++)
{
...
{
int-diff=1;
for(ptrdiff_t compare=0;compare<(walker-ary);compare++)
{
diff=strcmp(全名,*(ari+compare));
if(!diff)
{
打破
}
}
if(diff)
{
*walker=全名;
printf(“%s\n”,*walker);
}
}
}
这里的布尔条件究竟是什么:*walker<(*end=*ary+size)
?@OleksiyDobrodum应该检查walker字符串是否已到达数组的末尾。这里有一个提示:C中的相等运算符是什么?什么是赋值运算符?compare
是一个int
,walker
是一个指针。为什么要测试比较
?始终在启用所有警告的情况下编译。它会抓到很多虫子。
*walker = 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);
}
}
}