我只是试图从文本文件中读取,将一些信息解析为“字符串数组”,然后使用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);
}
答案 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
通话是您的主要问题。
但是,从文件中读取字符串的代码包含许多错误。请参阅strncpy
和strncat
以及fgets
的手册页,了解参数的含义以及它们生成的输出。关于如何使用feof
的{{3}}(提示:根本不应该使用它)。
我建议你将程序分成两部分:
一旦两个测试都成功,那么你可以将(2)的输出提供给(1)的输入。