1

このプログラムのこんにちは、私は文字列内の単語の数を数えることになっています。これまでのところ、文字列内の文字数を見つける方法を見つけましたが、単語を構成する文字を回転させて1単語として数える方法を理解することはできません。

私の機能は次のとおりです。

int wordcount( char word[MAX] ){

    int i, num, counter, j;

    num = strlen( word );
    counter = 0;

    for (i = 0; i < num; i++)
    {
        if (word[i] != ' ' || word[i] != '\t' || word[i] != '\v' || word[i] != '\f')
        {

        }

    }

    return counter;
}

いくつかのバリエーションを試しましたが、ifステートメントの中央部分が混乱しています。文字列内の単語数を数えるにはどうすればよいですか?このテストでは、文字列に「こんにちは、これは文字列です」のように複数のスペースがあるかどうかをテストします

4

4 に答える 4

3

これはおそらく宿題なので、ヒントだけです。

数えようとしているのは、「単語」文字と空白の間の遷移の数です。そのためには、最後の文字を覚えて、現在の文字と比較する必要があります。

一方が空白でもう一方が空白でない場合は、遷移があります。

詳細については、lastcharを空白に初期化してから、入力内のすべての文字をループします。lastchar空白があり、現在の文字がそうでない場合は、単語数を増やします。

lastchar各ループ反復の最後に現在の文字をコピーすることを忘れないでください。そして、単語数を0に初期化する必要があることは言うまでもありません。

于 2012-11-25T22:28:40.917 に答える
2

単語をカウントできる Linux util 'wc' があります。

見てください(説明とサンプルが含まれています):

http://en.literateprograms.org/Word_count_(C)

ソースへのリンク

http://en.literateprograms.org/index.php?title=Special:DownloadCode/Word_count_(C)&oldid=15634

于 2012-11-25T22:34:19.273 に答える
0

if の部分にいるときは、単語の中にいることを意味します。したがって、これにフラグを立ててinword、out of word (else の部分) からinword、またはその逆に変更するかどうかを調べることができます。

于 2012-11-25T22:31:00.217 に答える
0

これは簡単な提案です。もっと良い方法があるかもしれませんが、私はこれが気に入っています。

まず、単語が何でできているかを「知る」ようにしてください。文字だけでできているとしましょう。句読点または「空白」である残りのすべては、セパレーターと見なすことができます。

次に、「システム」には2つの状態があります。1)単語の完成、2)セパレータのスキップです。

スキップ区切りコードのフリーランでコードを開始します。次に、次のセパレーターまたは文字列全体の終わりまで保持される「単語の完成」状態に入ります (この場合は終了します)。これが発生すると、単語が完成したので、単語カウンターを 1 増やし、「区切りをスキップする」状態になります。そしてループは続く。

疑似 C ライク コード:

char *str;

/* someone will assign str correctly */

word_count = 0;
state = SKIPPING;

for(c = *str; *str != '\0'; str++)
{
    if (state == SKIPPING && can_be_part_of_a_word(c)) {
        state = CONSUMING;
        /* if you need to accumulate the letters, 
           here you have to push c somewhere */
    }
    else if (state == SKIPPING) continue; // unneeded - just to show the logic
    else if (state == CONSUMING && can_be_part_of_a_word(c)) {
        /* continue accumulating pushing c somewhere 
           or, if you don't need, ... else if kept as placeholder */
    }
    else if (state == CONSUMING) {
        /* separator found while consuming a word: 
           the word ended. If you accumulated chars, you can ship
           them out as "the word" */
        word_count++;
        state = SKIPPING;
    }
}
// if the state on exit is CONSUMING you need to increment word_count:
// you can rearrange things to avoid this when the loop ends, 
// if you don't like it
if (state == CONSUMING) { word_count++; /* plus ship out last word */ }

関数 can_be_part_of_a_word は、たとえば、読み取った文字が [A-Za-z_] にある場合は true を返し、そうでない場合は false を返します。

(疲労の軽減に重大な誤りを犯していなければ、うまくいくはずです)

于 2012-11-25T23:00:03.580 に答える