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