C ++ Beginner - While循环重复第一次迭代

时间:2017-02-13 22:13:06

标签: c++

所有

所以我一直在为这个问题绞尽脑汁。我的程序部分需要计算用户指定字符串中的空格/元音/字符。这是其中之一“教会你没有人会这样做的方式,因为你只能使用我们已经在课堂上所涵盖的那些”任务。所以我让用户输入一个文本,以一个sentinel char结尾,在这种情况下是'#'。当遇到哨兵时,循环在退出时非常有效,但它在字符串[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)的字符,那些给我正确的字符,我只是想不通为什么循环迭代两次为第一个字符和然后在第二次通过后工作正常。除了第一个char被复制之外,计数/输出是正确的。任何欣赏将不胜感激。

2 个答案:

答案 0 :(得分:1)

正如其他人所说,解决此类问题的正确方法是使用调试器。这会为你节省很多很多时间。

但无论如何,您的错误是在while循环结束时,您执行此操作:

characterToBeProcessed = userInputText.at(i++);

但在你的while循环之前,你会这样做:

characterToBeProcessed = userInputText.at(i);

您的问题是每次使用时都不会递增i,这自然会导致观察到的行为。

答案 1 :(得分: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;
}