Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Don';我不明白为什么C程序会崩溃,指针数组是字符串_C_Arrays_String_Pointers_For Loop - Fatal编程技术网

Don';我不明白为什么C程序会崩溃,指针数组是字符串

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也会导致程序崩溃,即使删除它除了输出

我遇到了这个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);

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);
    }
  }
} 
。。。
对于(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);
    }
  }
}