2017-02-13 95 views
-2

全部,C++初學者 - 雖然循環重複第一次迭代

所以我一直在絞盡腦汁關於這個。我有一段程序需要計算用戶指定字符串中的空格/元音/字符。這是其中一種「教會你沒有人會這樣做的方式,因爲你只能使用我們在課堂上已經講過的」各種作業。所以我有用戶輸入一個文本,以一個哨兵字符結尾,在這種情況下是'#'。該循環在遇到哨兵時退出時非常有效,但它在字符串[0]上繼續迭代兩次。下面的代碼:

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!# 

輸出是:

Below is the text entered by the user: 

HHi there, my friend! 

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

我已經有計劃輸出.AT的字符( 0)和.at(1),那些給我正確的字符,我只是無法弄清楚爲什麼循環爲第一個字符迭代兩次,然後在第二次通過後正常工作。除了第一個字符被複制之外,計數/輸出是正確的。任何讚賞將不勝感激。

+4

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

歡迎來到Stack Overflow。請花些時間閱讀[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

在第一位置的字符被讀兩次

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

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

如果您需要使用while循環,然後它可以像

i = 0; 

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

而且這種說法

totalCharacterCount++; 

在每個標籤下使用。最好將它放在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根本沒有。我們的初學者應該互相幫助。:) –