2017-06-03 56 views
0

林和我PROGRAMM麻煩應該算在一個字符串中的每個符號用戶發送到流。它包括輔音,元音,'ff','fl','fi'和'\ t','\ n'和''。問題是程序設計工作得很好,但仍然沒有計算空格,製表符和新行。我試圖使用noskipws機械手,但它沒有讀取任何東西,直到第一個字。計數使用空格,製表符和新線,而(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開始換行(假設你至少有一行)並循環你的字符串並計算你想要的任何字符。

+0

謝謝你的幫助! :) – FishTheBig

-2

使用gets(),或在現代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; 
}