我最近开始学习C语言,现在我想试着从文件中整理一些字符串。当我试图运行它时,我会得到“分段错误”。
这是我的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int compare (const void * a, const void * b ) {
return strcmp(*(char **)a, *(char **)b);
}
int main() {
static const char filename[] = "t1.txt";
char line1[1023];
char line2[1023];
FILE *file = fopen ( filename, "r" );
char filetext[1023][1023];
int i=0;
if ( file != NULL )
{
while ( fgets ( filetext[i], sizeof filetext, file ) != NULL )
{
fputs ( filetext[i], stdout );
i++;
}
fclose ( file );
}
else
{
perror ( filename );
}
int n;
printf("Before sorting the list is: \n");
for( n = 0 ; n < i; n++ ) {
printf("%s", filetext[n]);
}
qsort(filetext, i, sizeof(filetext[0]), (int (*)(const void*,const void*))strcmp);
printf("\nAfter sorting the list is: \n");
for( n = 0 ; n < i; n++ ) {
printf("%s", filetext[n]);
}
return 0;
}
例如,我想:
文件:t1
Priority9猫
优先权2 ls
Priority7猫之谜.h
进入之内
优先权2 ls
Priority7猫之谜.h
Priority9猫
通过调用“cat t1 j mysort”或“mysort
最佳答案
您的compare
函数产生segmentation fault
的原因是您将地址视为char**
而实际上需要将其视为char*
地址。这是存储输入数据的结果。
让我们用一个更小的filetext
来探索一下。
char filetext[4][10];
当您声明这样的数组时,以下语句为真:
filetext[0] == &filetext[0] == &filetext[0][0]
filetext[1] == &filetext[1] == &filetext[1][0]
filetext[2] == &filetext[2] == &filetext[2][0]
filetext[3] == &filetext[3] == &filetext[3][0]
为了
strcmp
,您必须将&filetext[0]
视为char*
,而不是char**
。如果你的定义有点不同,
char* filetext[4];
filetext[0] = malloc(11);
filetext[1] = malloc(11);
filetext[2] = malloc(11);
filetext[3] = malloc(11);
然后,
filetext[0] != &filetext[0]
filetext[1] != &filetext[1]
filetext[2] != &filetext[3]
filetext[3] != &filetext[3]
如果您将此
filetext
传递给filetext
,则必须将compare
视为&filetext[0]
,而不是char**
。希望能帮你澄清一些事情。