尝试在C中对字符串排序时出现分段错误
我只是尝试从一个文本文件中读取,将一些信息解析为一个“字符串数组”,然后使用qsort对数组进行字母排序。但是,在排序部分中,我不断遇到分段错误。我是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
#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字符结尾的。