Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
尝试在C中对字符串排序时出现分段错误_C_Sorting_Segmentation Fault - Fatal编程技术网

尝试在C中对字符串排序时出现分段错误

尝试在C中对字符串排序时出现分段错误,c,sorting,segmentation-fault,C,Sorting,Segmentation Fault,我只是尝试从一个文本文件中读取,将一些信息解析为一个“字符串数组”,然后使用qsort对数组进行字母排序。但是,在排序部分中,我不断遇到分段错误。我是C语言的新手,谁能看看我的代码,告诉我问题出在哪里 #include <stdlib.h> #include <stdio.h> #include <string.h> int compare (const void * a, const void * b ) { return strcmp(*(char

我只是尝试从一个文本文件中读取,将一些信息解析为一个“字符串数组”,然后使用qsort对数组进行字母排序。但是,在排序部分中,我不断遇到分段错误。我是C语言的新手,谁能看看我的代码,告诉我问题出在哪里

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

int compare (const void * a, const void * b ) {
  return strcmp(*(char **)a, *(char **)b);
}

int main(int argc, char* argv[]){
    FILE *fp;
    fp = fopen(argv[1], "r"); // argv[1] = "input.txt"
    char allStrings[255][255];
    int stringArrCounter = 0;

    char buff[255]; /* String to put the scanned shit in*/
    char blank[255];
    strcpy(blank, " ");

    int counter = 0;
    while (!feof(fp)){
        char stringer[255];
        char stringer2[255];
        fgets(buff, 255, fp);
        if (strcmp(buff, blank) > 0){
            if (counter % 5 == 0){
                strncpy(stringer, buff, strlen(buff)-1);
            }
            else if (counter % 5 == 1){
                strncat(stringer, buff, strlen(buff)-1);
            }
            else if (counter % 5 == 3){
                strncpy(stringer2, buff, strlen(buff)-10);
                strncat(stringer2, stringer, strlen(stringer));
            }
            else if (counter % 5 == 4){
                strcpy(allStrings[stringArrCounter], stringer2);
                printf("%s\n", stringer2);
                memset(stringer,0,sizeof(stringer));
                memset(stringer2,0,sizeof(stringer2));
                stringArrCounter++;
            }
            counter++;
        }
    }
    qsort(allStrings, 255, sizeof(char *), compare);
}
#包括
#包括
#包括
整数比较(常数无效*a,常数无效*b){
返回strcmp(*(字符**)a、*(字符**)b);
}
int main(int argc,char*argv[]){
文件*fp;
fp=fopen(argv[1],“r”);//argv[1]=“input.txt”
字符所有字符串[255][255];
int-stringArrCounter=0;
char buff[255];/*字符串,用于将扫描的内容放入*/
字符空白[255];
strcpy(空白,“”);
int计数器=0;
而(!feof(fp)){
字符串[255];
字符串2[255];
fgets(浅黄色,255,fp);
如果(strcmp(浅黄色,空白)>0){
如果(计数器%5==0){
strncpy(斯特林格,浅黄色,斯特伦(浅黄色)-1);
}
否则如果(计数器%5==1){
strncat(斜桁,浅黄色,斜桁(浅黄色)-1);
}
否则如果(计数器%5==3){
strncpy(stringer2,buff,strlen(buff)-10);
strncat(桁条2、桁条、桁条(桁条));
}
否则如果(计数器%5==4){
strcpy(所有字符串[stringArrCounter],stringer2);
printf(“%s\n”,stringer2);
memset(stringer,0,sizeof(stringer));
memset(stringer2,0,sizeof(stringer2));
stringArrCounter++;
}
计数器++;
}
}
qsort(所有字符串,255,sizeof(char*),比较);
}

下面是一个简短的示例,说明如何将
qsort
与二维数组一起使用。请注意,二维数组不同于指针数组。它是一个连续的字符组,编译器将根据您给定的维度计算偏移量

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

int comp10(void const *p1, void const *p2)
{
    typedef char const A[10];

    return strcmp( *(A *)p1, *(A *)p2 );
}

int main()
{
    char arr[3][10] = { "pangolin", "fish", "anteater" };

    qsort(arr, sizeof arr / sizeof arr[0], sizeof arr[0], comp10);

    for (int i = 0; i < sizeof arr / sizeof arr[0]; ++i)
        printf("%s\n", arr[i]);
}
#包括
#包括
#包括
内部组件10(无效常数*p1,无效常数*p2)
{
typedef char const A[10];
返回strcmp(*(A*)p1、*(A*)p2);
}
int main()
{
char arr[3][10]={“穿山甲”、“鱼”、“食蚁兽”};
qsort(arr,sizeof arr/sizeof arr[0],sizeof arr[0],comp10);
对于(int i=0;i

正确设置比较函数和
qsort
调用是您的主要问题

但是,从文件中读取字符串的代码包含许多错误。请查阅
strncpy
strncat
fgets
的手册页面,了解参数的含义及其生成的输出。了解如何使用feof(提示:您根本不应该使用它)

我建议您将计划分为两部分:

  • 排序逻辑,您将使用我的示例中的硬编码字符串列表来测试它
  • 文件读取逻辑,您将通过输出已读取的字符串来测试该逻辑

  • 一旦两个测试都成功,您就可以将(2)的输出输入到(1)的输入中。

    您可以编写expibits undefined行为代码。您的编译器应该发出警告,您应该注意它们。获取正确的类型,而不仅仅是使用
    void*
    和强制转换。您能告诉我们您从哪里获得seg故障吗?行#?对不起,这是我在C.Olaf中做的第一件事,你是说比较器吗?StephenG,如何获取行数?使用
    while(!feof(fp)){
    ,而不是
    while(fgets(buff,sizeof buff,fp)!=NULL){
    还可以使用
    strncpy(stringer,buff,strlen(buff)-1)删除\n;
    stringer
    不是以NULL字符结尾的。