这段C代码有什么问题
已知 file1 file2 file3 .... 是已经使用 sort 按行排序的文本文件(约 10 到 100 个,至少 10M 以上),请编写程序合并这些文件。文件名列表请从 argv 读取,如:
./sort-merge *.txt > result.txt
这里是仿 sort -m 方式排序文件,我这里写了一个非常简单的程序,但是用起来得core dump,麻烦哪个老师指导一下?[code]#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int readandwrite(FILE **fp, FILE *op, char line[][8192], char *max, int num, int m);
int compare_x (FILE **fp, FILE *op, char line[][8192], char *max, int num);
int main(int argc, char *argv[])
{
FILE *fp[argc];
FILE *op;
char line[argc][8192];
int i;
char *max = NULL;
if (argc < 2)
{
printf("Usage: %s <ARGV>\n", argv[0]);
exit(EXIT_FAILURE);
}
op = fopen("all.txt", "w");
for (i = 0; i < argc - 1; i ++)
{
fp[i] = fopen(argv[i+1], "r");
}
compare_x (fp, op, line, max, argc - 1);
for (i = 0; i < argc - 1; i ++)
{
fclose(fp[i]);
}
fclose(op);
return 0;
}
int readandwrite(FILE **fp, FILE *op, char line[][8192], char *max, int num, int m)
{
int i, j = 0;
for (i = 0; i < num; i ++)
{
if (!max || strcmp(max, line[i]) < 0)
{
max = line[i];
j = i;
}
}
fputs(max, op);
if (fgets(line[j], 8192, fp[j]) == NULL)
{
m ++;
memset (line[j], '\0', 8192);
if (m == num) return 0;
}
max = NULL;
readandwrite(fp, op, line, max, num, m);
return 0;
}
int compare_x (FILE **fp, FILE *op, char line[][8192], char *max, int num)
{
int i, j = 0, m = 0;
for (i = 0; i < num; i ++)
{
fgets(line[i], 8192, fp[i]);
if (!max || strcmp(max, line[i]) < 0)
{
max = line[i];
j = i;
}
}
fputs(max, op);
if (fgets(line[j], 8192, fp[j]) == NULL)
{
memset (line[j], '\0', 8192);
}
max = NULL;
readandwrite(fp, op, line, max, num, m);
return 0;
}[/code] 怎么没有人解答?
晚点儿回答
忙完手头的活儿先 有点疑问,argc是能在编译的时候确定的么?应该是在运行的时候才能确定吧?以此来声明数组的大小不行吧? [quote]原帖由 [i]真人品男[/i] 于 2008-1-16 13:40 发表 [url=http://bbs.linuxpk.com/redirect.php?goto=findpost&pid=42258&ptid=12775][img]http://bbs.linuxpk.com/images/common/back.gif[/img][/url]
有点疑问,argc是能在编译的时候确定的么?应该是在运行的时候才能确定吧?
以此来声明数组的大小不行吧? [/quote]
C99 标准和 GNU C Extension 支持声明变长数组。 已知 file1 file2 file3 .... 是已经使用 sort 按行排序的文本文件(约 10 到 100 个,至少 10M 以上)
-----------------------------------------------------
char line[argc][8192];
根据的你的意思argc 的值将会比较大,所以所你这个定义所需的内存应该是超过了栈的最大容量。具体每个编译器的栈大小是不同的,一般缺省的是1M或者2M 办法:
一。修改栈的缺省大小
二。修改程序中变量的定义,你可以存放在堆里,或者存放在全局空间中
页:
[1]