2017-02-13 25 views
-2

すべて、C++初心者 - 繰り返しループ最初の繰り返しを繰り返す

だから、私はこのことについて本当に頭を悩ましています。私は、ユーザ指定の文字列中のスペース/母音/文字を数える必要のあるプログラムのセクションを持っています。これは、「あなたがすでに授業でカバーしてきたものだけを使うことができるので、誰もそれをしないように教えてくれます」というものの一つです。だから、私はユーザーにテキストを入力させ、センチネルチャーで終わります。この場合は '#'です。このループは、センチネルに遭遇したときに終了することに関して素晴らしい動作をしますが、string [0]に対して2回繰り返し続けます。ここでは、コードです:だから

i = 0; 
characterToBeProcessed = userInputText.at(i); 

while (characterToBeProcessed != LOOP_SENTINEL) 
{ 
    fout << characterToBeProcessed; 

    // Convert to lowercase 
    characterToBeProcessed = 
     static_cast<char> (tolower(characterToBeProcessed)); 

    // Increment character counters 
    switch (characterToBeProcessed) 
    { 
     case 'a': 
     case 'e': 
     case 'i': 
     case 'o': 
     case 'u': 
      totalVowelCount++; 
      totalCharacterCount++; 
      break; 
     case ' ': 
      totalSpaceCount++; 
      totalCharacterCount++; 
      break; 
     default: 
      totalCharacterCount++; 
      break; 
    } 
    characterToBeProcessed = userInputText.at(i++); 
} 

がとき、私プロンプトで入力:

"Please input a text to be analyzed, ending with the # character: " 

Hi there, my friend!# 

出力は次のとおりです。私はプログラム出力に.ATのための文字を持っていた

Below is the text entered by the user: 

HHi there, my friend! 

Total characters: 21 
Total vowels: 5 
Total blank spaces: 3 

( 0)と.at(1)、それらは私に正しい文字を与える、私はちょうどループが最初のcharのために2回反復して、そして2回目の後にうまく動作する理由を理解できません。それ以外の点では、最初の文字が複製される以外は、カウント/出力は正しくなります。どんな感謝をいただければ幸いです。

+4

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+5

i ++と++ iの違いを考えてみましょう。 –

答えて

1

このような問題を解決する正しい方法は、デバッガを使用することです。それはあなたにたくさんの時間を節約します。

しかし、いずれにしても、あなたのエラーはあなたのwhileループの最後に、あなたがこれを行うことです。

characterToBeProcessed = userInputText.at(i++); 

しかし、あなたのwhileループの前に、あなたがこれを行う:

characterToBeProcessed = userInputText.at(i); 

あなたを問題は、使用するたびにiをインクリメントしていないことです。この結果、当然のことながら観察された動作になります。

0

最初の位置の文字を使用すると、whileループを使用する必要がある場合、それはまた、この声明

totalCharacterCount++; 

i = 0; 

while ((characterToBeProcessed = userInputText.at(i++)) != LOOP_SENTINEL) 
{ 
    //... 
    // remove the next statement 
    // characterToBeProcessed = userInputText.at(i++); 
} 

のように見えることができます二回

i = 0; 
characterToBeProcessed = userInputText.at(i); 
             ^^^^^^ 

while (characterToBeProcessed != LOOP_SENTINEL) 
{ 
    //... 
    characterToBeProcessed = userInputText.at(i++); 
              ^^^^^^^^ 
} 

読まれます各ラベルの下に使用されます。スイッチ文の前または後ろのswitch文の外側に配置する方がよいでしょう。たとえば、

totalCharacterCount++; 

switch (characterToBeProcessed) 
{ 
    case 'a': 
    case 'e': 
    case 'i': 
    case 'o': 
    case 'u': 
     totalVowelCount++; 
     break; 
    case ' ': 
     totalSpaceCount++; 
     break; 
    default: 
     break; 
} 
+0

ありがとうございました。私はあなたの時間を感謝します。 – user7559601

+0

@ user7559601全くありません。我々は初心者がお互いを助ける必要があります:) –