0

从文件中读取字符串并使用 qsort 打印排序后的输出。所以我写了这样的东西:

int main()
{
  int n=0;
  int size=1;
  File *fp = fopen(args[0],"r");
  int c;
  char* inputFile;
  inputFile = char* malloc(size);
  if(fp==0){
    fprintf(stderr, "Cannot open file!\n");
    return -1;
  else{
    do{
      c = fgetc(fp);
      if(size==1){
        inputFile[n]=c;
      }
      else{
        inputFile = char* realloc(inputFile, size+1);
        inputFile[n]=c;
      }
      n++;
      size++;
  }while(c!=EOF);
  qsort(inputFile, 1, size, compare);//I have implement the compare function correctly
  n=0;
  while(n<size){
    while(input[n]!='\0'){
       printf ("%d ",inputFile[n]);
       n++;
    }
    n++;
  }
  return 0;
}

所以,如果输入文件是'\0vaaa\n\0ba\0\nabc',程序应该输出打印:

abc
ba
vaaa

但是,我的代码根本不起作用。我检查了比较方法是否返回正确的结果。另外,我只是想知道我是否正确实现了 malloc-realloc?谢谢

4

3 回答 3

1

你想打印字符串,所以替换:

printf ("%d ",inputFile[n]);

printf ("%s ",inputFile[n]);

但是您的代码中可能还有其他问题..

于 2013-02-07T18:09:06.317 回答
0

首先,最好只mmap(2)将文件放入内存而不是痛苦地读取它,但是哦,好吧。

不要投射结果malloc(3)及其同类。Unneded,可能会掩盖错误。

qsort(3)对数组(固定大小的元素)进行排序。创建一个类似 的数组char *line[],将其设置为每个元素都指向相应的行。我的 qsort(3) 手册页(来自 Linux 手册页)有一个这样做的例子。

于 2013-02-07T18:14:30.010 回答
0

啊,我看到你的代码中有很多错误。

请参阅这个示例(与 C99 编译器兼容)。请注意,这只是您的程序的一部分。我没有qsort在这个中使用过。

#include <stdio.h>

int main(int argc, char **argv)
{
  int i, length;
  int j = 0;
  FILE *f = fopen("nullfile.bin","r");
  while((i = fgetc(f)) != EOF) j++;
  rewind(f);
  int array[j];
  length = j;
  j = 0;
  while((i = fgetc(f)) != EOF)
    array[j++] = i;
  fclose(f);
  for(i = 0; i < length; i++){
    if(array[i] == '\0') { printf("\n"); continue; }
    printf("%c", array[i]);
  }
  return 0;
}

我完全摆脱malloc()并使用可变长度数组。这样代码就简单多了。

于 2013-02-07T18:17:56.623 回答