在 C 中对文件中的字符串进行排序



我最近开始学习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优先级9 猫优先级2 ls优先级7 猫咪

优先级2 ls优先级7 猫咪优先级9 猫

通过调用"Cat T1 j Mysort"或"Mysort <T1">

您的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**

如果你对filetext的定义有点不同,

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传递给compare,你必须把&filetext[0]当作一个char**,而不是一个char*

希望这能为您澄清一些问题。

相关内容

  • 没有找到相关文章

最新更新