【问题标题】:Sorting Strings from file in C在C中对文件中的字符串进行排序
【发布时间】:2014-05-18 00:10:34
【问题描述】:

我最近开始学习 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 cat mysort.h

进入

优先级2 ls Priority7 猫 mysort.h 优先9猫

通过调用“cat t1 j mysort”或“mysort

【问题讨论】:

  • qsort(filetext, i, sizeof(char), compare); --> qsort(filetext, i, sizeof(filetext[0]), (int (*)(void*,void*)strcmp); and #include &lt;stdlib.h&gt;, while ( fgets ( filetext[i], sizeof filetext, file ) != NULL ) : sizeof(filetext[0])
  • 我有输入:(int (*)(void*,void*) --> (int (*)(const void*, const void*))
  • @BLUEPIXY 改成这样:qsort(filetext, i, sizeof(filetext[0]), (int ( * )(const void * ,const void*))strcmp);并包含 。现在错误消失了,但它没有对其进行排序。我将“const”添加到“void”,因为没有它会出现很长的错误。
  • 你应用蓝冰的答案吗?
  • 请删除所有你不知道确切在做什么的演员表,并解释为什么演员表必须正确工作。永远不要扼杀编译器,而是要求它说出来:使用-Wall -Wextra,并适当地处理所有警告。

标签: c string file sorting


【解决方案1】:

您的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,您必须将&amp;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,则必须将&amp;filetext[0] 视为char**,而不是char*

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2016-02-05
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多