0

各単語は AZ (または az) 以外の任意の文字で区切ることができることを知って、文字列内の単語数を見つけることになっているコードを書いています。私が書いたコードは、文頭に句読点がない場合にのみ正常に動作します。しかし、引用符などの句読点で文を開始すると問題が発生します (つまり、"Only connect." は結果として 2 語ではなく 3 語を表示します)。Dev-C++ を使用して C++ でプログラミングしています。あなたの助けに感謝します。私のコードは以下の通りです:

#include <cstring>
#include <iostream>
#include <conio.h>
#include <ctype.h>

using namespace std;

int getline();   //scope
int all_words(char prose[]);  //scope

int main()
{
   getline();
   system ("Pause");
   return 0;
}


int getline()
{
    char prose[600];
    cout << "Enter a sentence: ";

    cin.getline (prose, 600); 
    all_words(prose);
    return 0;
}


int all_words(char prose[])
{ int y, i=0, k=0; int count_words=0; char array_words[600], c;

    do
     {

        y=prose[i++];
        if (ispunct(y))  //skeep the punctuation
         i++;

         if ((y<65 && isspace(y)) || (y<65 && ispunct(y)))     //Case where we meet spacial character or punctuation follwed by space

          count_words++;   //count words

         if (ispunct(y))  //skeep the punctuation
           i++;

    }while (y); //till we have a character

    cout <<endl<<" here is the number of words  "<< count_words <<endl;

   return 0; 

 }



 ***********************************Output******************************
  Enter a sentence: "Only connect!"

  here is the number of words  3

  Press any key to continue . . .
4

2 に答える 2

2

アルゴリズムを再考する必要があると思います。頭のてっぺんから、次のようにするかもしれません。

  • 文字列の最後ではないループ
    • アルファベット以外のすべての文字をスキップ ( while (!std::isalpha))
    • すべての英字をスキップ ( while (std::isalpha))
    • 単語カウンターを増やす

これらの内側のループでも、文字列の末尾を確認することを忘れないでください。

于 2012-09-11T09:25:43.143 に答える
0

初め

if (ispunct(y))

最初の引用符で、カウンター i をインクリメントしましたが、var y にはまだ "が含まれています。これは、2 番目の条件を true として生成します。最後の " は、count_words++ に追加のインクリメントを与えます。

if ((y<65 && isspace(y)) || (y<65 && ispunct(y)))

とにかく、あなたの仕事は、文字列をトークンに分割して数えることだけです。ソリューションの例は、ここで見つけることができます。

于 2012-09-11T09:51:20.267 に答える