如何解析包含字符串的字符串和5个没有向量c ++的整数

时间:2016-10-13 19:58:01

标签: class c++11

我正在创建一个函数,它接受一个字符串作为数据看起来像:“D。Smith,87,65,98,87,92”,然后用逗号分析字符串并分配变量的值:string name,int score1,int score2,int score3,int score4和int score5。请注意,解析字符串时,字符串的第一部分(D. Smith)应保存为字符串,而以下部分(87,65,98,87,92)应保存为整数。将字符串作为输入后,输出应如下所示:

Name: D. Smith

Score One: 87

Score Two: 65

Score Three: 98

Score Four 87

Score Five: 92

我知道这可以通过向量来完成,但我的目标是找到一种不用的方法。现在,这是我的代码:

Quarterback::Quarterback(string data) {

    string Name;
    int j = 0;
    for (int i = 0; i < data.length(); i++) {

        if (data[i] == ',')
            j++;
            while (j < 1){
                Name = Name + data[i];
            }

        .....
    }

我是否按照这种想法走上了正确的轨道?任何建议将不胜感激!

2 个答案:

答案 0 :(得分:0)

在给你一个解决方案之前,我会给你一些提示,以便你能多思考一下。想想你需要拆分字符串的所有部分。是,,对吗?所以,只需像你一样检查逗号,如果找到它,你要么找到了字符串,要么找到了一些整数。在另一种情况下,只需将该字符添加到某个临时字符串中,该字符串将是您要解析的当前部分。

答案 1 :(得分:0)

首先,(因为您使用的是标准库),您应该真正使用迭代器。使用它们,你可以“标记”字符串中的任何位置(并获得它的char值),因此没有内存浪费在临时字符串上,你可以随意拥有它们(名称的开头,名称的结尾,开始)数字,数字结尾,字符串结尾等。它们当然支持算术(加/减,递增/递减,比较等)。并且一对迭代器可以很容易地转换为字符串。

其次,您应该使用尽可能多的内置函数(例如std::find(...)来查找逗号,迭代器对字符串转换等)以尽量减少可能的错误。

最后(但并非最不重要):将复杂任务划分为一系列简单的子任务(使用C ++,它们的性能成本为零)。在你的情况下,它将是:找到下一个逗号,解析数字。因此,您的代码应类似于:

Quarterback::Quarterback(string data) {
    auto stringStart = data.cbegin();
    auto stringEnd = data.cend();

    auto nameStart = stringStart;
    auto nameEnd = findNextComma(nameStart, stringEnd);

    std::string name(nameStart, nameEnd); // easy as that :)

    auto numberStart = nameEnd;
    while (numberStart < stringEnd) {
        auto numberEnd = findNextComma(numberStart + 2, stringEnd); // skip previous comma and space
        int number = parseNumber(numberStart, numberEnd); // do whatever you need to do with an int
        numberStart = numberEnd;
    }
}

template <typename I> I findNextComma(I start, I end) {
    ...
}
template <typename I> int parseNumber(I start, I end) {
    ...
}