2016-08-15 5 views
1

私はこのコードをnoにするために実装しました。単語数のそれは私が入力として"q w r "を入力すなわちあれば、それは私に3つの言葉を与え、すべての単一の文字のため正常に動作しますが、私は、入力として"qwe ed df "入力すると、それはあなたのコードに問題があなたの散乱される2文字列を使わないで単語の総数を数えるには?

#include<stdio.h> 
int main() 
{ 
    int c=getchar(); 

    int words=0; 

    while(c!=EOF) 
    { 
     if(c==' ' || c=='\n') 
     { 
      c=getchar(); 
     } 
     else if(c>='a' && c<='z') 
     { 
      c=getchar(); 

      if(c==' ') 
      { 
       words=words+1; 
       c=getchar(); 
      } 
      else 
      { 
       c=getchar(); 
      } 
     } 
    } 
    printf("%i\n",words); 
} 
+2

など、数字に対処するためのコード、句読点を調整することができます - あなたは信用を得ます偶然にも 'int c;'と 'char c;'ではなく、そしてループの中では '私は単語である 'ということを追跡します。もしあなたが言葉を読んでいて、スペースを読んでいないなら、あなたはまだ言葉にしています。あなたが単語を書いていて、スペースを読んでいるなら、あなたは単語を終えました(そして、もはや単語ではありません)。あなたが言葉ではなく、空白以外の文字を取得した場合、あなたは今言葉にしています。単語カウンタをインクリメントします。あなたが一言も言わずにスペースを取れば、あなたはまだ言葉ではありません。 ''ヘッダには文字分類マクロがあります。 –

+0

読み込みは1か所で、先読みと 'ungetc'です。 – BLUEPIXY

+0

ファイルが大きい場合は、読み込みをバッファリングすることを検討してください(例えば 'char buf [1024] =" "; while(fgets(buf、1024、stdin)){char * p = buf; [ここでのあなたのロジック]})。その理由は、メモリー内での操作は、一度にファイルI/Oよりも1桁高速です。 (あなたはあなたの 'buf'サイズを意味のあるものに選ぶことができます。バッファーが8文字であれば、かなりの改善が見られます) –

答えて

1

を表示しますあなたが見ているバグを隠しているgetcharへの呼び出し。

すべての文字がスペースかどうか、すべての文字が文字かどうかを確認する必要があります。今、あなたはちょうどそれらのグループ内のロジックをうまくする必要が

while ((c = getchar()) != EOF) { 
    if (c == ' ' || c == '\n') { 

    } else if (c >= 'a' && c <= 'z') 

    } else { 

    } 
} 

:よう

何か。あなたは論理的な権利を持っています(前の文字が文字だった場合は、スペースを得て単語を増やします。しかし、getcharへの複数回のご連絡は、がお忘れの可能性があることを意味します。この状態。

上記の隙間を埋めると効果があります。 (そして、大文字でテストしてください!)

+0

else if文の後ろにスペースが入っているかどうかを調べるgetchar手紙かどうか。それでは前のコードとの違いは? –

+0

@himanshujhamb:いいえ、それはあなたの問題の原因です。前の手紙を追跡することができます。また、あなたが以前に言葉であったかどうかを示すフラグを付けることもできます。 – dave

2

トリックは境界を数えることです。

あなたの元のコードは、一対の' '続い'a' =>'z'で結果を読み込む場合

 if(c==' ') 
     { 
      words=words+1; 
      c=getchar(); 
     } 

コードは、単語だけをカウントし...周りにバグがあります。

トリックは、ループを1つの時間ループで1文字に読みやすくすることです。 (これは奇妙な境界が起こらないようにする)、あなたが単語やスペースを食べているかどうかをモデル化した状態マシンです。

enum Mode { word = 1, spaces = 2 }; 
int c=getchar(); 
enum Mode currentMode = spaces; 
int words=0; 

while(c!=EOF) 
{ 
    if(c==' ' || c=='\n') 
    { 
     if(currentMode == word) { 
      words=words+1; 
     } 
     currentMode = spaces; 
    } 
    else if(c>='a' && c<='z') 
    { 
     currentMode = word; 
    } 
c=getchar(); 
} 
// count the last word... 
if(currentMode == word) { 
    words=words+1; 
} 

このコードでは、アルファベット以外の文字は、単語もスペースも無視されます。

EDIT:固定正しくない列挙型の使用

+2

モードの状態を間違って割り当てていると思いますか? (空白と単語が切り替わります) –

+0

Thanks @ Daniel-Jour - fixed – mksteve

+1

'興味深いことに、単語の終わりを検出しています。単語の先頭を検出した場合は、ループの後の増分を避けることができます。 'それがスペースブロックである場合'の条件とそのインクリメントを削除し、単語を開始するときにインクリメントします( 'else if'ブロック内)。私はそれが同じ答えを生み出すと思う。 –

1

あなたのwhileループであまりにも多くの場所で文字を読んでいます。これが間違った出力を得る理由です。このループを使用してみてください:

while(c!=EOF) 
{ 
    while(c == ' ' || c == '\n') //consume multiple spaces 
    { 
     c = getchar(); 
    } 

    for(int i=0 ;c >= 'a' && c <= 'z'; i++) //consuming a word 
    { 
     if(i == 0) //increment word count once at the start of each word 
     { 
      words++; 
     } 

     c = getchar(); 
    } 

} 
+0

[this](http://ideone.com/G1L1AN) – BLUEPIXY

+0

ありがとうございました。私はこれがそれだと思う:http://ideone.com/TfvXbp – Cherubim

+1

yup、 苦情のある人がいるかもしれない。 でも このコードは現実的な範囲で動作すると思います。 – BLUEPIXY

0

あなたのコードは、私はプログラムの

ロジックは完全に罰金ではないと思います

を持っている文字列に問題の文字の偶数を持っています最後にこの条件を追加する必要がありますelse

if(c==' ') 
    { 
    words=words+1; 
    c=getchar(); 
    } 

プログラムは次のようになります:あなたは2文字の文字列を入力し、スペースを追加するときに、この最後のスペースは数を増加しませんelse文の中の最後のgetcharによって読み込まれますので、

#include <stdio.h> 

int main() 
{ 
    int c=getchar(); 

    int words=0; 

    while(c!=EOF) 
    { 
     if(c==' ' || c=='\n') 
     { 
      c=getchar(); 
     } 
     else if(c>='a' && c<='z') 
     { 
      c=getchar(); 
      if(c==' ') 
      { 
       words=words+1; 
       c=getchar(); 
      } 
      else 
      { 
       c=getchar(); 
       if(c==' ') 
       { 
       words=words+1; 
       c=getchar(); 
       } 
      } 
     } 
    } 
    printf("%d\n",words); 
    return 0; 
} 

言葉。

チェックthis results

こちらがお役に立てば幸いです。

+0

これはあなたと一緒に働いていますか? – SADMI

+0

いいえ...それは.....同じ問題で立ち往生していません –

+0

上記の結果を見ましたか?ここで再び[結果](http://i.stack.imgur.com/O1aMp.png).. ... – SADMI

0

文字がスペース(空白)をたどるか、最初の文字であるたびに、単語数を増やします。狭い整数を使用してカウントを制限する必要はなく、ファイルは非常に長くなる可能性があります。

// Useful is...() functions declared here. 
#include <ctype.h> 

unsigned long long words = 0; 
int previous = ' '; 
int ch; 
while ((ch = getchar()) != EOF) { 
    if (isspace(previous) && isalpha(ch)) words++; 
    previous = ch; 
} 
printf("%llu\n",words); 

OPは、通常の技術が ``しばらく((C = getchar関数())= EOFを!)を使用することです

関連する問題