-1

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

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)?wc 命令如何处理这个?

4

4 回答 4

1

why you don't use strpbrk() standard libc function? Do some thing alse:

    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 */
    }
于 2012-09-18T20:04:36.447 回答
0

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

于 2012-09-18T19:14:30.517 回答
0

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

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

于 2012-09-18T19:16:17.677 回答
0

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

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

于 2012-09-18T20:07:13.113 回答