【问题标题】:Segmentation fault in C bubble sortC冒泡排序中的分段错误
【发布时间】:2021-02-09 07:31:15
【问题描述】:

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

#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);
}

【问题讨论】:

  • 当您在您的fscanf 调用中使用data 作为目标时,这与&amp;data[0] 相同,这是一个char **,并且绝对是错误的类型,并且不会指向您期望的位置。
  • char *data[45]; ... fscanf(fp, "%s", data) 没有任何意义。
  • 当你解决了这个问题时,请记住scanf 系列函数不能为字符串分配内存,这是你的责任。如果您不这样做,那么 data 是一个 未初始化 指针数组。
  • 哦,您需要考虑一下如果输入文件中的字数少于(或多于!)45 个字会发生什么。
  • 最后,当j 未初始化时,j=j+1 也没有任何意义。也许你的意思是j = i + 1

标签: arrays c bubble-sort


【解决方案1】:

代码现在可以工作了。比较源文件以确保找到所有差异。主要方面:需要为数据分配内存(不仅仅是指针)。在实践中,您需要找出需要分配多少内存。如果您将 fscanf 文件转入数据,则将其读入 data[i] 而不是读入数据。不要在这里只使用“45”。我添加了变量“num”来存储单词数。然后,您还需要在循环中使用“num”,并比较“for(j=i+1;j

#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

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2014-03-26
    • 2018-11-13
    • 2014-02-25
    相关资源
    最近更新 更多