标记字符串并将标记放入不同数据类型的变量中?

Tokenizing string and put tokens in variables of different data types?

我想标记一个字符串,例如每次出现“ ” (space) 时,“5 + 3 * 2 - 4 ”。运算符符号应保存在不同命名的 char 变量中。不同命名浮点变量中的数字。 例如

float num_1 = 5;
float num_2 = 3;
float num_3 = 2;
float num_4 = 4;

char op_1 = '+';
char op_2 = '*';
char op_3 = '-';

到目前为止,这是我的分词器。但这只能在控制台中打印数字和操作符。那不是我想要的。

std::vector<std::string> strings;
    std::istringstream f("3 + 2 * 4 ");
    std::string s;
    while (std::getline(f, s, ' ')) {
        std::cout << s << std::endl;
        strings.push_back(s);
    }

我用谷歌搜索了很久,但从未找到对我有帮助的东西。我只是一个初学者,我用谷歌搜索的大部分代码对我来说太难理解了,或者这不是我需要的:/

如果我猜对了,你需要的是有一个变量,它在每次迭代时将 s 存储在 strings 中。您的问题是 getline() 采用您在 ' ' 处设置的参数定界符并在其处停止。例如:

s = '3'; // First iteration

然后 while 停止,因为 f 只存储了一行。 您应该考虑使用 strtok_r() 或逐个字符迭代并将它们存储到字符串中,直到遇到 ' '

看来你已经完成了大部分工作。您缺少的是一种了解子字符串 s 是运算符还是数字的方法。您可以轻松地为此编写辅助函数。这是您的代码的修改版本,应该可以正常工作。就输入而言,它当然不是万无一失的,但它应该能让你继续。

// Checks if the string is an operator
bool IsOperator(std::string const& str)
    {
    if (1 != str.size())
        return false;

    if (str[0] == '*' || str[0] == '-' || str[0] == '+' || str[0] == '/')
        return true;

    return false;
    }

// Converts the string into a float
float ParseValue(std::string const& str)
    {
    return stof(str);
    }

int main()
    {
    float* = n
    std::vector<float> values;
    std::vector<char> operators;

    std::istringstream f("3 + 2 * 4 ");
    std::string s;
    while (std::getline(f, s, ' '))
        {
        if (IsOperator(s))
            operators.push_back(s[0]);
        else
            values.push_back(ParseValue(s));
        }

    return 0;
    }

编辑 -- 使用数组。

int main()
    {
    float values[100];
    char operators[100];

    size_t valuesIdx = 0;
    size_t operatorsIdx = 0;

   std::istringstream f("3 + 2 * 4 ");
    std::string s;
    while (std::getline(f, s, ' '))
        {
        if (IsOperator(s))
            {
            operators[operatorsIdx] = s[0];
            ++operatorsIdx;
            }
        else
            {
            values[valuesIdx] = ParseValue(s);
            ++valuesIdx;
            }
        }

    return 0;
    }