使用C计算线的平均长度

时间:2014-04-24 10:10:52

标签: c string character

我有一个文本文件,我填写了不同文本的数字行,具有不同的行长度。
我想要做的是计算在我的工作中对我来说重要的每行平均数字。我在C中编写了以下代码来实现这一目标。但是编译后我无法运行程序。

#include<stdio.h>
#include<stdlib.h>

#define LENGTH 10000000

int main()
{
    char c;
    int i;
    int line_length;
    int j;
    int char_count;
    char char_a[LENGTH];
    int line_a[LENGTH];
    int line_count;
    long sum;
    float avg_char_count;
    FILE *fp=fopen("input.txt","r");
    if(!fp){
        fprintf(stderr,"cannot open file");
        exit(1);
    }
    /*read into file*/
    i=0;
    sum=0;
    while(char_a[i++]=fgetc(fp))
            sum++;

    printf("chars count: %d \n",sum);

    /*process array*/
    char_count=i;
    j=0;    
    line_count=0;
    while(j++<char_count){
        if(char_a[j]=='\n'){
            sum--;
            line_count++;
        }   
    }

    /* calculate the average*/
    avg_char_count=sum/(float)line_count;
    printf("\naverage # of chars in a line is: %f\n ",avg_char_count);
    return  EXIT_SUCCESS; 
}   

顺便说一句,我使用的是Borland C ++命令行工具BCC32,在Windows 7 SP1上运行 我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

最可能的原因是你在堆栈上分配了20 Mb的变量。

我会更改程序,以便它一次在线读取文件(或者一次只读取一个字符)。 这样你只需要为一行而不是整个文件分配空间。

答案 1 :(得分:0)

尝试将char_a和line_a声明为char和int的指针:

char *char_a;
int *line_a;

然后使用malloc动态分配内存。

char_a=(char*)malloc(10000000*sizeof(char));
line_a=(int*)malloc(10000000*sizeof(int));

其次,你的while循环应该在你到达文件末尾时结束,即EOF。

while(char_a[i]=fgetc(fp)){
            if(char_a[i++]==EOF)
                break;

                sum++;
     }

而且,你应该将line_count初始化为1而不是0,因为当没有&#39; \ n&#39;在文本文件中,仍然可以有一行。如果有一个&#39; \ n&#39;在文本文件中,这意味着有两行(比如说,你在第1行,然后你点击回车,这是&#39; \ n&#39;,然后你到达新行,所以对于一行&#39; \ n&#39;,有2行。

    /*process array*/
    char_count=sum;
    j=0;
    line_count=1;
    while(j++<char_count){
        if(char_a[j]=='\n'){
            sum--;
            line_count++;
        }
    }

注意 - 目前,您的char_count在打印时包含换行符(&#39; \ n&#39;)。最后打印语句,因为在程序结束时,您已经通过减少第二个while循环的if语句中的总和来排除换行。