在c++中解析字符串并将输入参数连接到现有变量



我想读取一个输入字符串,并将其值连接到我的类中的变量。

一些示例输入可能是:

78 C 15.48
3 B
87 P 15
0
..

第一个参数是0-100之间的整型,第二个是char型,第三个是int型或浮点型。字符串可以由一个、两个或三个参数组成,参数之间用空格分隔。在读取一行之后,该程序进行一些计算,然后等待另一个输入,直到输入0或出现换行符。

读取一个输入字符串,我目前使用

std::string str;
std::getline(std::cin, str);

我的程序已经有变量

int firstArgument;
char secondArgument;
float thirdFloatArgument;
int thirdIntArgument;

现在,我们设str是:46 C 87.3在阅读完这一行之后,我的变量应该是:

firstArgument = 46;
secondArgument = 'C';
thirdFloatArgument = 87.3;

如何从输入字符串中提取信息?我正在考虑计算空格,看看给出了多少值,然后通过这个分隔符分隔字符串,因为参数的数量可能会有所不同。所以:

int count = 0;
int length = str.length();
for(int i = 0; i < length; i++){
    int c = str[i];
    if(isspace(c)){
        count++;
    }
}

与空间计数为2我现在知道3个参数被传递,但我不知道如何从那里继续。使用std:istringstream可能是一种选择,但从我在网上看到的情况来看,它主要用于while循环,以在新行中打印字符串的每个单词或类似的内容。但是我的输入可以改变参数的数量,所以循环不能工作。

我想我需要这样的东西:"字符串前的第一个' ' '是firstArgument,字符串之间的第一个和第二个' ' '是secondArgument,字符串后的第二个' ' '要么是thirdFloatArgument或thirdinargument(分别如果只有一个或两个参数给出,这可以确定与空间的数量)。但我该怎么做呢?还是有更简单的方法?

提前感谢!

正如一些程序员提到的,使用std::istringstream将值从字符串转换为其他数据类型是一个好主意。它允许你像对待std::cin一样对待输入字符串。以下是您可以在这种情况下使用的代码片段:

#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
struct Arguments {
    int first{};
    char second{};
    double third{};
};
Arguments parseArgs(const std::string& inputLine) {
    Arguments args;
    const int argc = std::ranges::count(inputLine, ' ');
    std::istringstream stream(inputLine);
    if (argc >= 0) {
        stream >> args.first;
    }
    if (argc >= 1) {
        stream >> args.second;
    }
    if (argc >= 2) {
        stream >> args.third;
    }
    return args;
}
int main() {
    std::string inputLine{};
    std::getline(std::cin, inputLine);
    const auto args = parseArgs(inputLine);
    std::cout << args.first << ", " << args.second << ", " << args.third << "n";
}

请注意,您必须使用c++ 20编译这个示例,因为我使用了std::ranges。如果没有支持此标准的编译器,可以使用std::count(inputLine.cbegin(), inputLine.cend(), ' ');

最新更新