-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));
}
}

行数と文字数については正しいのですが、単語数については間違っています。ご覧のとおり、スペースの数を数えていますが、複数のスペースがある場合、単語を数える方法 (ファイルポインターで fscanf などの f* 関数を使用したくない) wc コマンドはこれをどのように処理しますか?

4

4 に答える 4

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

これを処理する方法はたくさんあります。1つは、ブールフラグを使用して、最後の文字がスペース文字であるかどうかを示すことです。次に、現在の文字がスペースで最後の文字がスペースではなかった場合にのみ、単語カウンターを更新します。

于 2012-09-18T19:14:30.517 に答える
0

ええ、それはまったく正しくありません。単語間に複数のスペースがあるとどうなりますか? また、単語がタブや改行文字で区切られている場合はどうなりますか?

代わりに、状態を追跡する必要があります。そして、空白文字が一般的であることを確認する必要がありますisspace()。空白以外の文字をヒットした場合は、IsInWord = true に設定します。次に、空白文字セット IsInWord = false をヒットすると。ただし、空白文字をヒットし、IsInWord が true の場合は、最初に単語を数えます。

于 2012-09-18T19:16:17.677 に答える
0

単語用と行用の単純なステート マシンが必要です。(行数も間違っている可能性があります。たとえば、最後の行に ? がない場合はどうなり'\n'ますか?)

ワード ステート マシンは、(1) ワード間および (2) ワード内の状態を示す必要があります。状態 1 でスペース以外を取得した場合は、状態 2 に移行し、カウンターをインクリメントします。状態 2 でスペースを取得すると、状態 1 に戻ります。

于 2012-09-18T20:07:13.113 に答える