0

你好 Stackoverflow,我又来这里为我的 C++ 编程课提问了。我面临的问题主要是由于用户从键盘输入。我需要能够接受用户输入来决定调用什么函数以及给函数提供什么参数。例如,add 5会使用参数 5 调用 add 函数。起初我尝试重载 >> 运算符以同时获取字符串和 int 但我遇到的问题是程序无法在没有 int 的情况下获取输入,例如deletemax所以我不得不放弃这个想法。所以现在我回到对输入进行标记,但我们不允许在这个程序中使用 Boost,所以我想出了这样的东西使用 sstream

    bool out = false;
string token;
string In;
int num;

do
{
    cout << "heap> ";
    cin >> In;
    istringstream iss(In);
    while(getline(iss, token, ' '))
    {
      cout << token << endl; //I know this is incorrect but just not what to replace it with
    }
    out = ProcessCommand (token, num); //Takes string and int to call correct functions
} while (out != true);

问题在于我不太确定如何正确标记字符串,因此我可以获得 2 个字符串并将第二个字符串转换为 int。谁能给我一些帮助?我将不胜感激。另外,如果有比我尝试的更好的方法来解决这个问题,我也想听听。

感谢你给与我的帮助。

4

3 回答 3

1

谷歌搜索“C++ string tokenize”会给你带来很多点击,第一个点击是在 Stackoverflow 上。但你应该试一试。我猜这是练习的重点。

您说“argumentS”,这表明您支持的命令采用不同数量的参数。我会这样分解:

  1. 从用户那里读取一行
  2. 在空间边界上将行拆分为“令牌”,将令牌存储在列表中
  3. 根据列表中的第一个标记,选择要执行的命令
  4. 将令牌列表传递给命令,因此它可以验证/解释它们作为参数

棘手的部分是#2。你知道容器类吗?您可以使用vector<string>来存储您解析的块。要进行实际解析,您需要遍历字符串的字符。跳过空白,直到找到非空白字符(或用完字符)。保存这个位置:start。然后跳过非空格,直到找到空格(或用完字符)。保存这个位置:end。复制 from startto之间表示的子字符串end并将其复制到您的令牌列表中。

如果您以前从未这样做过,那么确定这方面的实际细节,确保您没有错误等将是具有挑战性的,我猜这就是重点。

于 2012-04-25T18:42:51.133 回答
0

您不需要一次阅读整个用户输入。

例如,您可以读取用户输入的第一位(操作adddeletemax等)。从那里根据操作,您可以继续从输入中读取参数(在 的情况下add)或立即开始执行操作(在 的情况下deletemax)。

于 2012-04-25T18:33:56.183 回答
0

一种方法是将一个std::map函数名作为键,并将所需数量的参数作为值。您将读取一行输入,获取函数名称,然后决定是否需要其他参数。如果输入无效,我会编写一个函数,该函数会返回vector从字符串流或空向量中提取的参数。

于 2012-04-25T18:46:34.460 回答