有人能解释这个while循环中的错误吗?

时间:2014-06-14 21:21:50

标签: c++ while-loop

所以,我是一名初学程序员......我无法弄清楚我在为文本冒险而写的这段代码中的问题是什么。我只想做它目前让用户输入一个命令,然后将其转换为ALLCAPS并将其打印出来。它应输出:

What shall I do?
pie
Your raw command was: PIE

但相反,它会输出:

What shall I do?
pie
PIE

......然后冻结了。这是代码:

#include <iostream>
#include <string>
#include <cctype>
#include <cstring>
#include <vector>
using namespace std;

void command_case();

string userIn;
string raw_command;
int x = 0;

int main()
{
    while(raw_command != "QUIT")
    {
        cout << "What shall I do?\n";
        cin >> userIn;
        command_case();
        cout << "Your raw command was: " << raw_command << endl;
    }
    return 0;
}

void command_case()
{
    char command[userIn.size()+1];
    strcpy(command, userIn.c_str());
    while(x < userIn.size()+1)
    {
        if(islower(command[x]))
        {
            command[x] = toupper(command[x]);
            cout << command[x];
            x++;
        }
        else if(isupper(command[x]))
        {
            cout << command[x];
            x++;
        }
    }
    raw_command = command;
}

我认为void command_case()中的while循环可能存在问题,但我无法确切地知道该问题是什么。我很感激你能给我的任何建议。

4 个答案:

答案 0 :(得分:1)

太多了:

while(x < userIn.size()+1)

答案 1 :(得分:1)

问题在于command_case()函数中的x变量。

当x变为3(并且“command [x]指向”pie“末尾的空字符时)

if语句的任何部分都不执行,因此x永远保持为3。 由于“userIn.size()+ 1”为4,x永远不会达到4,因此循环永不退出。

一种可能的解决方案是从if语句的两个部分中删除“x ++”,并在if语句之后使用单个“x ++”。无论“command [x]”指向哪个字符,这都会在每个循环中递增x。

答案 2 :(得分:0)

您应该从command_case()函数中删除所有cout调用。事实上,函数中的整个if-branch是无用的,你可以用以下代码替换它:

command[x]=toupper(command[x]);

为简单起见,您可以将整个command_case()函数替换为(只记得#include <algorithm>):

std::transform(userIn.begin(), userIn.end(), userIn.begin(), toupper);

答案 3 :(得分:0)

您可以轻松地执行类似

的操作
void command_case()
{
    for(int i =0; i<userIn.size(); i++)
    {
      userIn[i] = toupper(userIn[i]);
    }
}

然后在主

cout<<userIn