标记字符串以存储值的好方法?或替代用户输入

Good way to tokenize a string to store values? Or alternative for user input

本文关键字:输入 用户 方法 字符串 存储      更新时间:2023-10-16

再次问你好,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。谁能给我一些帮助?我将不胜感激。此外,如果有比我尝试的更好的方法,我也想听听。

感谢您给我的任何帮助。

谷歌搜索"C++字符串标记化"会给你带来很多点击,第一次点击是在Stackoverflow上。但你应该试一试。我猜这是练习的重点。

说"argumentS",这表明您支持的命令需要不同数量的参数。我会这样分解它:

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

棘手的部分是#2。您知道容器类吗?您可以使用vector<string>来存储您解析的区块。若要执行实际分析,请循环访问字符串的字符。跳过空格,直到找到非空格字符(或字符用完)。保存此位置:start 。然后跳过非空格,直到找到空格(或字符用完)。保存此位置:end 。复制从 startend 之间表示的子字符串,并将其复制到令牌列表中。

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

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

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

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