使用C计算直线的平均长度

使用C计算直线的平均长度,c,string,character,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 cha

我有一个文本文件,我从不同的文本中填充了许多行,具有不同的行长度
我想做的是计算每行的平均字符数,这对我的工作很重要。为了实现这一点,我用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; 
}   
#包括
#包括
#定义长度10000000
int main()
{
字符c;
int i;
内线长度;
int j;
整数字符计数;
字符a[长度];
int line_a[长度];
整数行计数;
长和;
浮动平均字符数;
文件*fp=fopen(“input.txt”,“r”);
如果(!fp){
fprintf(stderr,“无法打开文件”);
出口(1);
}
/*读入文件*/
i=0;
总和=0;
while(char_a[i++]=fgetc(fp))
sum++;
printf(“字符数:%d\n”,总和);
/*进程阵列*/
字符计数=i;
j=0;
行计数=0;

而(j++最可能的原因是您在堆栈上分配了20 Mb的变量

我会更改程序,使其一次在线读取文件(甚至一次读取一个字符)。
这样,您只需要为一行而不是整个文件分配空间。

尝试将char\u a和line\u 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++;
     }
并且,您应该将行计数初始化为1而不是0,因为当文本文件中没有“\n”时,仍然可以有一行。如果文本文件中有一个“\n”,则表示有两行(例如,您在第1行,然后按enter键,即“\n”,然后进入新行,因此对于一个“\n”,有两行)

/*进程数组*/
字符计数=总和;
j=0;
行计数=1;

while(j++是否编译?运行时是否失败?是否运行但返回错误的输出?请提供有关实际问题的更多信息。您能否更具体地说明您的程序如何失败。您得到了什么输出?是否有异常?运行时是否失败。Windows会打开一个弹出窗口,显示“avg.exe已停止工作”。当我在命令行中运行它时,我看不到任何输出。更多信息
问题签名:问题签名:问题事件名称:APPCRASH应用程序名称:avg.exe应用程序版本:0.0.0.0应用程序时间戳:00000000故障模块名称:avg.exe故障模块版本:0.0.0故障模块时间戳:00000000异常代码:c0000005异常偏移量:000011ac OS版本:6.1.7601.2.1.0.256.1区域设置ID:1065附加信息1:2d0f附加信息2:2d0f4d9134f55833e7fdd1b383e9e851附加信息3:4445附加信息4:44455F5D9A03194691B8551759DDCDEC您不应将任何变量声明为全局变量。如果需要移动某些内容对于文件作用域,您应该将其声明为静态。在这种情况下,它也没有帮助,因为在每个主流操作系统中,如此巨大的内存量应该始终分配在堆上,而不是其他任何地方。@user3340994不
while(char_a[i]=fgetc(fp)){
自动检查EOF?while()和if()等将0视为false。但是fgetc(fp)返回读取的字符,当文件结束时,它将返回EOF。但EOF不是0。EOF通常为-1(实际上取决于系统)。因此,不能使用它来中断while()循环。这就是while()循环永不结束且程序无法运行的原因。
    /*process array*/
    char_count=sum;
    j=0;
    line_count=1;
    while(j++<char_count){
        if(char_a[j]=='\n'){
            sum--;
            line_count++;
        }
    }