使用C程序计算字符、单词、句子、行或以上所有内容。

使用C程序计算字符、单词、句子、行或以上所有内容。,c,function,C,Function,我们被要求创建一个程序,该程序提供一个表格,用户可以在其中选择是计数字符、单词、句子、行还是以上所有内容。这要求每个实用程序具有单独的功能。我的行计数器工作得很好,但由于某种原因,字符计数器函数一直返回0。该计划是不完整的,但我对字符计数器感到非常失望 #include <stdlib.h> #define WHT_SPC\ (cur == ' ' || cur == '\n' || cur == '\t') int countLines(sp1); int w

我们被要求创建一个程序,该程序提供一个表格,用户可以在其中选择是计数字符、单词、句子、行还是以上所有内容。这要求每个实用程序具有单独的功能。我的行计数器工作得很好,但由于某种原因,字符计数器函数一直返回0。该计划是不完整的,但我对字符计数器感到非常失望

#include <stdlib.h>

#define WHT_SPC\
         (cur == ' ' || cur == '\n' || cur == '\t')

int countLines(sp1);
int wordCounter(sp1);
int characterCounter(sp1);
int sentenceCounter (sp1);

int main()
{
    int lineCount = 0;
    int wordCount = 0;
    int characterCount= 0;
    int sentenceCount = 0;
    char filename[100];
    FILE* sp1;


    printf("Enter Filename to be read: ");
    gets(filename);
    sp1 = fopen(filename,"r");


    lineCount = countLines(sp1);
    characterCount = characterCounter(sp1);


    printf("Number of Lines: %d\n",lineCount);
    printf("Number of Characters: %d\n",characterCount);

    fclose(sp1);
    return 0;
}


int countLines(sp1)
{
    int curCh;
    int preCh;
    int countLn = 0;

    while ((curCh = fgetc(sp1)) != EOF)
    {
        if (curCh == '\n')
            countLn++;
        preCh = curCh;
    }
    if (preCh != '\n')
        countLn++;


    return countLn;
}

int characterCounter(sp1)
{
    int chr;
    int countCh = 0;

    while ((chr = fgetc(sp1)) != EOF)
    {
        if (chr != 'n' && chr != ' ')
            countCh++;
    }

    return countCh;
}
#包括
#定义WHT\U SPC\
(cur=''| | cur='\n'| | cur=='\t')
整数计数线(sp1);
int字计数器(sp1);
int字符计数器(sp1);
int语句计数器(sp1);
int main()
{
int lineCount=0;
int字数=0;
int characterCount=0;
int-sentenceCount=0;
字符文件名[100];
文件*sp1;
printf(“输入要读取的文件名:”);
获取(文件名);
sp1=fopen(文件名为“r”);
lineCount=countLines(sp1);
characterCount=characterCounter(sp1);
printf(“行数:%d\n”,行数);
printf(“字符数:%d\n”,characterCount);
fclose(sp1);
返回0;
}
整数计数行(sp1)
{
int-curCh;
int-preCh;
int countLn=0;
而((curCh=fgetc(sp1))!=EOF)
{
如果(curCh='\n')
countLn++;
preCh=curCh;
}
如果(preCh!='\n')
countLn++;
返回计数ln;
}
int字符计数器(sp1)
{
int-chr;
int countCh=0;
而((chr=fgetc(sp1))!=EOF)
{
如果(chr!=“n”&&chr!=“n”)
countCh++;
}
返回计数;
}

我理解缺乏评论并不理想,但我的问题非常具体。不是寻找答案,只是给我一些建议,告诉我正确的方向

sp1
是一种结构,其中包含您在正在阅读的文件中的位置。在
countLines()
的内部循环之后,此字段将指向文件的结尾。您需要调用<代码>倒带(sp1),这样它将重新开始工作。 不要犹豫,看看吧

fgetc()
递增文件指针

因此,
characterCounter()
countLines()
之后缩放的
characterCounter()必须返回0,因为它遇到的第一个字符是EOF


尝试使用
fseek(sp1,0L,SEEK\u SET)
before
characterCounter()

在开始字符计数之前,您没有打开文件。而缺少注释与此代码无关,甚至与编译无关(在任何函数decls/defs中都没有针对
sp1
的类型)。非常感谢。我知道注释与编译没有任何关系,但有人告诉我这是一个很好的做法。最好只对文件进行一次遍历,并计算字符、单词和行数,等等。倒带并再次读取文件是低效的。@starkI知道这样会更好,但分配给他的任务是他希望我们这样做。相信我,我认为作业本身并不现实,但你能做些什么。非常感谢你的反馈。倒带功能对我来说是新的,所以我只有一个问题。我必须在每个函数的末尾或开头倒带它吗?Nevermind只是测试了一下,发现你可以把它放在每个函数之前,它工作正常。再次感谢。现在一切正常,请毫不犹豫地将您的问题标记为已结束;-)