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

时间:2015-09-06 23:17:33

标签: 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 **)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);
}

1 个答案:

答案 0 :(得分:0)

以下是如何将qsort与二维数组一起使用的简短示例。请注意,2-D数组与指针数组不同。它是一个连续的字符块,编译器将根据您给出的尺寸计算偏移量。

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

正确设置比较功能和qsort通话是您的主要问题。

但是,从文件中读取字符串的代码包含许多错误。请参阅strncpystrncat以及fgets的手册页,了解参数的含义以及它们生成的输出。关于如何使用feof的{​​{3}}(提示:根本不应该使用它)。

我建议你将程序分成两部分:

  1. 排序逻辑,您将使用硬编码的字符串列表进行测试,如我的示例
  2. 文件读取逻辑,您将通过输出已读取的字符串进行测试。
  3. 一旦两个测试都成功,那么你可以将(2)的输出提供给(1)的输入。

相关问题