0

私は C++ Primer 第 5 版を使って独学で C++ を学んでいます。本の中で、これまでに提供されたツールを使用して第 5 章で解決する方法がわからない問題に出くわしました。私は以前にプログラミングの経験があり、を使用してこれを自分で解決しnoskipwsました。ライブラリの使用を最小限に抑えてこの問題を解決する方法についてのヘルプを探しています。初心者向けの本の最初の 4 ~ 5 章を考えてみてください。

問題は、if ステートメントを使用して読み取られるすべての母音、スペース、タブ、および改行文字を見つけてカウントすることです。問題に対する私の解決策は次のとおりです。

// Exercise 5.9
int main() 
{
char c;
int aCount = 0;
int eCount = 0;
int iCount = 0;
int oCount = 0;
int uCount = 0;
int blankCount = 0;
int newLineCount = 0;
int tabCount = 0;   
while (cin >> noskipws >> c) 
{       
    if( c == 'a' || c == 'A')
        aCount++;
    else if( c == 'e' || c == 'E')
        eCount++;
    else if( c == 'i' || c == 'I')
        iCount++;
    else if( c == 'o' || c == 'O')
        oCount++;
    else if( c == 'u' || c == 'U')
        uCount++;       
    else if(c == ' ')
        blankCount++;       
    else if(c == '\t')
        tabCount++;     
    else if(c == '\n')
        newLineCount++;     
}
cout << "The number of a's: " << aCount << endl;
cout << "The number of e's: " << eCount << endl;
cout << "The number of i's: " << iCount << endl;
cout << "The number of o's: " << oCount << endl;
cout << "The number of u's: " << uCount << endl;
cout << "The number of blanks: " << blankCount << endl;
cout << "The number of tabs: " << tabCount << endl;
cout << "The number of new lines: " << newLineCount << endl;    
return 0;
}

これを解決するために私が考えることができる唯一の他の方法は、getline() を使用し、ループ回数をカウントして「/n」カウントを取得し、各文字列をステップ実行して「/t」と「」を見つけることです。

事前にご協力いただきありがとうございます。

4

2 に答える 2

5

noskipwsこれを交換することで回避できます

while (cin >> noskipws >> c) 

while ( cin.get(c) ) 

抽出演算子>>は、空白を含む区切り記号の規則に従います。

istream::getデータを逐語的に抽出します。

于 2013-03-19T21:24:39.413 に答える
0

あなたのコードは完全に正常に動作します:

入力:

This is a test or something
New line
12345
Test 21

出力:

The number of a's: 1
The number of e's: 5
The number of i's: 4
The number of o's: 2
The number of u's: 0
The number of blanks: 7
The number of tabs: 0
The number of new lines: 3

大文字と小文字を同時にテストするには、 std::tolower () 関数をチェックすることをお勧めします。また、あらゆる種類の文字を確認するには、std::isalpha () 、 std::isdigit ()、std::isspace ()、および同様の関数を調べます。

さらに、関数を std::cin に依存しないようにし、代わりに std::cin を使用して文字列を取得し、その文字列を関数に渡すことができます。これにより、関数を std だけでなく任意の文字列に使用できます。 :cin入力。

noskipws の使用を避けるには (個人的にはこれで問題ないと思います)、1 つのオプションとして次のようにします: (既に提供されている他のソリューションの代替オプションとして)

std::string str;
//Continue grabbing text up until the first '#' is entered.
std::getline(cin, str, '#');
//Pass the string into your own custom function, to keep your function detached from the input.
countCharacters(str); 

例はこちらをご覧ください)

于 2013-03-19T21:23:49.000 に答える