c - C语言文件中的字符串排序

标签 c string file sorting

我最近开始学习 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 优先级7猫mysort.h

进入

优先级 2 ls 优先级 7 猫 mysort.h 优先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*

希望这能为您解决一些问题。

关于c - C语言文件中的字符串排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883809/

相关文章:

c++ - 线程接收空字符串

javascript - 如何在文件对话框中选择文件或文件夹

指针可以转换成void指针吗?

c++ - C和C++中的全局变量有什么区别?

java - 如何优化这段丑陋的代码?

c++ - 打印字符串的所有子串时出错

c - 用 weak 属性在 c 中编写测试代码是不好的做法吗?

c - fread() 无法正常工作?

ios - 在 iCloud 中使用预先存在的 NSFileManager 代码

java - 如何使用文件列表中的一个文件