2017-06-03 4 views
0

私のプログラムに問題があり、ユーザがストリームに送信した文字列のすべてのシンボルをカウントする必要があります。子音、母音、 'ff'、 'fl'、 'fi'、 '\ t'、 '\ n'、 ''をカウントします。問題は、プログラマーはかなりうまくいくが、まだスペース、タブ、新しい行を数えていないことである。私はnoskipwsマニピュレータを使用しようとしましたが、それは最初の単語まで何も読んでいません。while(cin >>)を使用してスペース、タブ、および改行を計算する

ここにある:

int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0, 
consonantCnt=0; 

int ffCnt = 0, flCnt = 0, fiCnt = 0; 

int spaceCnt = 0, newlCnt = 0, tabCnt = 0; 

char *check = new char[100]; 

while (cin >> check) { 

for (int ix = 0; ix < strlen(check); ++ix) { 

switch (check[ix]) { 
    case 'a': case 'A': 
     ++aCnt; 
     break; 
    case 'e': case 'E': 
     ++eCnt; 
     break; 
    case 'i': case 'I': 
     ++iCnt; 
     break; 
    case 'o': case 'O': 
     ++oCnt; 
     break; 
    case 'u': case 'U': 
     ++uCnt; 
     break; 
    case ' ': 
     ++spaceCnt; 
     break; 
    case '\t': 
     ++tabCnt; 
     break; 
    case '\n': 
     ++newlCnt; 
     break; 
    default: 
     if (isalpha(check[ix])) 
      ++consonantCnt; 
     break; 
} 

    if (check[ix] == 'f') { 
    ++ix; 
     switch (check[ix]) { 
      case 'f': 
       ++consonantCnt; 
       ++ffCnt; 
       break; 
      case 'i': 
       ++fiCnt; 
       ++iCnt; 
       break; 
      case 'l': 
       ++consonantCnt; 
       ++flCnt; 
       break; 
      case 'I': 
       ++iCnt; 
       break; 
      case 'a': case 'A': 
       ++aCnt; 
       break; 
      case 'e': case 'E': 
       ++eCnt; 
       break; 
      case 'o': case 'O': 
       ++oCnt; 
       break; 
      case 'u': case 'U': 
       ++uCnt; 
       break; 
      case ' ': 
       ++spaceCnt; 
       break; 
      case '\t': 
       ++tabCnt; 
       break; 
      case '\n': 
       ++newlCnt; 
       break; 

      default: 
       if (isalpha(check[ix])) 
       ++consonantCnt; 
       break; 
     }  
    } 
    } 
} 

delete [] check; 

cout << "Встретилась a: \t" << aCnt << '\n' 
<< "Встретилась e: \t" << eCnt << '\n' 
<< "Встретилась i: \t" << iCnt << '\n' 
<< "Встретилась o: \t" << oCnt << '\n' 
<< "Встретилась u: \t" << uCnt << '\n' 
<< "Встретилось согласных: \t" << consonantCnt << '\n' 
<< "Встретилось fl: \t" << flCnt << '\n' 
<< "Встретилось fi: \t" << fiCnt << '\n' 
<< "Встретилось ff: \t" << ffCnt << '\n' 
<< "Встретилось символов табуляции: \t" << ffCnt << '\n' 
<< "Встретилось символов пробела: \t" << ffCnt << '\n' 
<< "Встретилось символов новой строки: \t" << ffCnt << '\n' 
<< '\n'; 
+1

std :: stringを使用します。 std :: getlineで行を読んでください。 strlenのような関数は使わないでください。 –

+0

これは後で試してみます。ありがとうございました! – FishTheBig

答えて

1
int tabCount = 0, spaceCount = 0, newlineCount = -1; 
while(std::getline(std::cin, line)){ //getline reads in a line to a string tokenized by \d by default 
    newlineCount++; //every time there's a new loop, theres a new newline. 
    for(auto c : line) { 
     if(c == '\t') 
      tabCount++; 
     else if(c == ' ') 
      spaceCount++; 
    } 
} 

あなたはラインで、文字列のラインを読み込むために、この基本的なフォーマットを使用することができますstd :: cinまたは他の入力ストリームから。 std :: getlineは自動的に '\ n'でトークン化されますので、-1から改行を開始することができます(少なくとも1行を取得すると仮定します)。

+0

ありがとうございます! :) – FishTheBig

-2

使用が取得()や現代のC++コンパイラのgets_sで()

#include "iostream" 
using namespace std; 
int main() { 
    char x[20]; 
    gets_s(x); 
    for (int i = 0; i < 20; i++) { 
     if (x[i] == ' ') { 
      cout << i; 
     } 
    } 
    system("pause"); 
    return 0; 
} 
関連する問題