计算C中的行,单词和字符

时间:2012-09-18 19:09:47

标签: c

下面是我计算行数,单词和字符数的函数 -

void count(char* file) {

int fd;
long end=0;
char c;
long words=0;
long lines=0;

if((fd=open(file, O_RDONLY))>0){
    end=lseek(fd, 0, SEEK_END);
    lseek(fd, 0, SEEK_SET);
    while(read(fd, &c, 1)==1){
        if(c == ' ')
            words++;
        if(c == '\n') {
            lines++;
            words++;
        }
    }

    printf("The Number of characters in file is: %ld\n",end);   
    printf("The Number of lines in file is: %ld\n",lines);
    printf("The Number of words in file is: %ld\n",words);

    close(fd);
}
else{
    printf("Error: ",strerror(errno));
}
}

我对线条和字符的数量是正确的,但是字数不正确。如你所见,我正在计算空格数,如果有多个空格,如何计算单词(我不想使用f *函数,如fscanf与filepointer)? wc命令如何处理这个?

4 个答案:

答案 0 :(得分:1)

为什么不使用strpbrk()标准libc函数?做一些事情:

    char keys[] = " \n";
    ...
    while( expression ){

        ret = read(fd, buf, BUF_LEN - 1);

        if (ret == -1)
            /*do errno*/
        else if ( ret ) {

            char* p = buf;
            buf[ ret ] = '\0';

            while( (p = strpbrk(p, keys)) ) {
                if (*p == key[1])
                    ++lines;
                ++words;
                ++p;
            }
        }
        else
            /* do close file */
    }

答案 1 :(得分:0)

有很多方法可以解决这个问题。一种可能是使用布尔标志来指示最后一个字符是否是空格字符。然后你只更新单词计数器,如果当前字符是空格并且最后一个字符空格等等。

答案 2 :(得分:0)

是的,这看起来不太合适。如果单词之间有多个空格会怎么样?如果单词由制表符或换行符分隔,会发生什么?

相反,您应该跟踪状态。你应该检查isspace()的空格字符是否正常。当您点击不是空格的字符时,请设置IsInWord = true。然后,当你点击空格字符集IsInWord = false时。但是当你点击空白字符并且IsInWord为真时,首先计算单词。

答案 3 :(得分:0)

你需要一个简单的状态机用于单词,一个用于行。 (你的行数也可能是错误的。例如,如果最后一行没有'\n'怎么办?)

你的单词状态机需要指出:(1)单词之间和(2)单词内部。如果在状态1中获得非空格,则转换到状态2并递增计数器。当您在状态2中获得空间时,转换回状态1.