Arrays C冒泡排序中的分段错误

Arrays C冒泡排序中的分段错误,arrays,c,bubble-sort,Arrays,C,Bubble Sort,我有一个文本文件,每行有一个单词列表,我应该将它们存储在一个数组中,然后按字母顺序排序。我被困住了,我需要一些指导。我得到的唯一错误是730段故障 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *data[45]; int i; int j; // OPENS THE FILE FILE *fp = fopen(

我有一个文本文件,每行有一个单词列表,我应该将它们存储在一个数组中,然后按字母顺序排序。我被困住了,我需要一些指导。我得到的唯一错误是
730段故障

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char *data[45];
    int i;
    int j;
    // OPENS THE FILE
    FILE *fp = fopen("/classes/cs3304/cs330432/Programs/StringerTest/TestInput.txt", "r");
    

    if (fp == NULL) {
        printf("Unable to open the file\n");
    } else {
        while (fscanf(fp, "%s", data) == 1)
            printf("%s\n", data);
        fclose(fp);
    }

    char temp[100];
    
    for (i = 0; i < 45 - 1; i++) {
        for (j = j + 1; j < 45; j++) {
            if (strcmp(data[i], data[j]) > 0) {
                strcpy(temp, data[i]);
                strcpy(data[i], data[j]);
                strcpy(data[j], temp);
            }
        }
    }

    for (i = 0; i < 45; i++) {
        printf("%s", data[i]);
    }
    return (0);
}
#包括
#包括
#包括
int main(){
字符*数据[45];
int i;
int j;
//打开文件
文件*fp=fopen(“/classes/cs3304/cs330432/Programs/StringerTest/TestInput.txt”,“r”);
如果(fp==NULL){
printf(“无法打开文件\n”);
}否则{
而(fscanf(fp,“%s”,数据)==1)
printf(“%s\n”,数据);
fclose(fp);
}
炭温度[100];
对于(i=0;i<45-1;i++){
对于(j=j+1;j<45;j++){
if(strcmp(数据[i],数据[j])>0){
strcpy(温度、数据[i]);
strcpy(数据[i],数据[j]);
strcpy(数据[j],温度);
}
}
}
对于(i=0;i<45;i++){
printf(“%s”,数据[i]);
}
返回(0);
}

代码现在可以工作了。比较源文件以确保找到所有差异。主要方面:需要为数据(不仅仅是指针)分配内存。实际上,您需要找出需要分配多少内存。如果将文件fscanf转换为数据,则将其读入数据[i],而不是读入数据。不要只在这里使用“45”。我添加了变量“num”来存储字数。然后,您还需要在循环中使用“num”,并比较“for”(j=i+1;j代码现在可以运行了。比较源文件以确保找到所有差异。主要方面:需要为数据分配内存(而不仅仅是指针)。实际上,您需要找出需要分配多少内存。如果您将文件转换为数据,则将其读入数据[i]不要输入到数据中。不要只在这里使用“45”。我添加了变量“num”来存储字数。然后,在循环中也需要使用“num”,当您在
fscanf
调用中使用
数据作为目的地时,需要比较(j=I+1;jfor),这与
数据[0]相同
这是一个
char**
类型绝对错误,不会指向您期望的位置。
char*data[45];
fscanf(fp,“%s”,data)
没有任何意义。当你解决了这个问题后,请记住
scanf
函数族不能为字符串分配内存,这是你的责任。如果你不这样做,那么
数据
就是一个未初始化指针的数组。哦,你需要考虑一下如果更少(或更多!)最后,
j
未初始化时,
j=j+1
也没有任何意义。也许你的意思是
j=i+1
?当你在
fscanf
调用中使用
data
作为目标时,这与
&data[0]是一样的
这是一个
char**
类型绝对错误,不会指向您期望的位置。
char*data[45];
fscanf(fp,“%s”,data)
没有任何意义。当你解决了这个问题后,请记住
scanf
函数族不能为字符串分配内存,这是你的责任。如果你不这样做,那么
数据
就是一个未初始化指针的数组。哦,你需要考虑一下如果更少(或更多!)最后,
j=j+1
未初始化时,
j
也没有任何意义。也许你的意思是
j=i+1
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main() 
{
    char data[45][45];
    int i;
    int j;
    int num;

    // OPENS THE FILE
    FILE *fp = fopen("test.txt", "r");
    

    if (fp == NULL) 
    {
       printf("Unable to open the file\n");
    }
    else
    {
       i=0;
       while(fscanf(fp, "%s", data[i]) == 1 )
       {
          i++;
       }
       num=i;
    }
    fclose(fp);

    char temp[100];
    
    for ( i=0;i<num-1;i++)
    {
        for(j=i+1;j<num;j++)
        {
            if(strcmp (data[i], data[j]) > 0)
            {
                strcpy(temp,data[i]);
                strcpy(data[i], data[j]);
                strcpy(data[j], temp);
            }
        }
    }


    for (i=0;i<num;i++)
    {
       printf("%s ", data[i]);
    }

    // BEGIN: write to file.txt (as asked in comment) 
    fp = fopen ("file.txt", "w+");
    if(fp==NULL) return 1;
    for (i=0;i<num;i++)
    {
       fprintf(fp,"%s ", data[i]);
    }
    fclose(fp);
    // END: write to file.txt (as asked in comment)

    return (0);

}
$ cat test.txt
just a text to test this code
$ ./a.out
a code just test text this to