在C程序中使用带指针数组的strcmp()函数

在C程序中使用带指针数组的strcmp()函数,c,strcmp,C,Strcmp,我试图检测指针数组中的重复字符串。我想用strcmp()函数检测是否有任何重复,并想删除除第一个之外的重复,但是当我添加strcmp()函数时,命令行给出错误:分段错误(堆芯转储) 这是我的密码; 并且大小等于产品数组的大小 FILE* temp_file_to_read = fopen("temp.txt", "r"); char temp_line[256]; char *products[256]; int j = 0; while(fgets(temp_line, s

我试图检测指针数组中的重复字符串。我想用strcmp()函数检测是否有任何重复,并想删除除第一个之外的重复,但是当我添加
strcmp()
函数时,命令行给出错误:
分段错误(堆芯转储)

这是我的密码; 并且大小等于产品数组的大小

FILE* temp_file_to_read = fopen("temp.txt", "r");
char temp_line[256];  
char *products[256];
int j = 0;
        while(fgets(temp_line, sizeof(temp_line), temp_file_to_read)){
                //printf("%s", temp_line);
                products[j] = strdup(temp_line);
                printf("%s", products[j]);
                j++;
        }


         for(int i = 0; i< size; i++){
                    for(int j = i+1; j <  size; j++){
                            if(strcmp(products[i], products[j])==0){
                                    printf("%s is exist\n", products[j]);
                            }
                    }
            }
FILE*temp\u FILE\u to\u read=fopen(“temp.txt”、“r”);
字符温度线[256];
char*产品[256];
int j=0;
while(fgets(临时线、大小线、临时文件读取)){
//printf(“%s”,临时行);
产品[j]=标准(温度线);
printf(“%s”,产品[j]);
j++;
}
对于(int i=0;i
我猜您的文件中没有256个产品,每个产品的长度正好是256个字符,因此您的
产品数组未满。因此,当您执行strcmp(products[i],products[j])
时,您将在某个时候尝试使用垃圾指针,就像它们指向一个真正的字符串一样,这就是您得到segfault的地方

您的代码有几处错误,包括

  • 您可能希望在新的行中分解文件,而不仅仅是每256个字符(尽管我可能错了)
  • 您应该检查以确保创建的产品不会超过256个,否则将导致阵列溢出
  • 在进行字符串比较时,只进行您拥有的产品数量,而不是盲目地进行数组末尾的比较

在这种情况下,您应该使用调试器缩小问题的范围。“给出分段错误”-在哪里???@Goodstorning抱歉,我编辑了它。如果我使用strcmp()检查重复,就会发生。是的,已经声明了。但是,您至少应该进行一些调试,并告诉我们哪行代码会产生分段错误!顺便说一下,您还需要确保
while
循环在
j
达到256时不会继续。那些
for
循环意味着
products
数组包含256个有效指针,这不是必需的。这里的另一个错误是来自外部范围的
j
循环阴影内部
j
。感谢您的帮助,@goodvibration也声明了这一点,我重新编辑了代码。它解决了st故障。解释清楚!