从文件中读取字符串并使用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',程序应输出print:
abc
ba
vaaa
但是,我的代码根本不起作用。我检查了compare方法返回正确的结果。另外,我只是想知道我是否正确实现了malloc-realloc? THX
答案 0 :(得分:1)
您想要打印字符串,请替换:
printf ("%d ",inputFile[n]);
与
printf ("%s ",inputFile[n]);
但您的代码中可能还有其他问题..
答案 1 :(得分:0)
首先,将文件mmap(2)
放入内存可能更好,而不是痛苦地读取它,但是哦。好吧。
不要投射malloc(3)
及其同类的结果。没有人,可能会掩盖错误。
qsort(3)
对数组进行排序(固定大小的元素)。创建一个类似char *line[]
的数组,进行设置,使每个元素指向相应的行。我的qsort(3)手册页(来自Linux手册页)有一个例子正是这样做的。
答案 2 :(得分:0)
Gah,我发现您的代码中存在很多错误。
请参阅此 small 示例(与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()
并使用可变长度数组。这种代码更加简单。