Linux论坛's Archiver

《开源》旗舰电子杂志2008年11期发布,火热下载中!

lsof 发表于 2008-1-7 18:53

这段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]

lsof 发表于 2008-1-8 13:09

怎么没有人解答?

9命怪猫 发表于 2008-1-8 13:12

晚点儿回答

忙完手头的活儿先

真人品男 发表于 2008-1-16 13:40

有点疑问,argc是能在编译的时候确定的么?应该是在运行的时候才能确定吧?
以此来声明数组的大小不行吧?

neo 发表于 2008-1-21 10:26

[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 支持声明变长数组。

prediction 发表于 2008-1-21 16:12

已知 file1 file2 file3 .... 是已经使用 sort 按行排序的文本文件(约 10 到 100 个,至少 10M 以上)
-----------------------------------------------------
char line[argc][8192];
根据的你的意思argc 的值将会比较大,所以所你这个定义所需的内存应该是超过了栈的最大容量。具体每个编译器的栈大小是不同的,一般缺省的是1M或者2M

prediction 发表于 2008-1-21 16:13

办法:
一。修改栈的缺省大小
二。修改程序中变量的定义,你可以存放在堆里,或者存放在全局空间中

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.