从字符串C ++

时间:2018-10-06 21:46:37

标签: c++ string int

所有人都好,

我很难尝试从字符串中提取所需的整数。我得到以下内容可以从文件中读取:

商品名称商品编号价格百分比标记

示例

  • 礼服-u2285 24.22 37%

  • TwoB1Ask1-m1275 90.4 1%

我一直想做的是将商品编号与商品名称分开,以便我可以将商品编号存储为排序参考。如您所见,第一个示例itemnameitemnumber是一个清晰的字符到数字的分隔符,而下一个示例在其项目名称中包含数字。

我尝试了几种不同的方法,但是事实证明,某些商品名称的名称之间使用整数分开,这超出了我的经验。

如果有人可以帮助我,我将不胜感激他们的时间和知识。

2 个答案:

答案 0 :(得分:1)

美好的一天,

我不知道,itemnumber的位数是否固定,但我将假定您没有。

这是一种简单的方法;首先,您必须将一行中的单词分开。例如,使用std::istringstream

当您将行拆分为多个单词时,例如通过将其迭代器赋予向量,或使用operator>>进行读取,您便开始从后往上检查第一个单词,直到找到任何内容< / em> 不是"0123456789 " 之一(请注意末尾的空格)之一。 完成此操作后,您将获得迭代器,以了解这些数字的结尾位置(从后向后),并剪切原始字符串,或者如果有机会,请剪切已拆分的字符串。瞧!您拥有自己的商品名称和商品编号。

为了记录,我将做全部事情,当然也要使用相同的百分比标记技术,当然,例外字符是"% "

#define VALID_DIGITS "0123456789 "
#define VALID_PERCENTAGE "% "

struct ItemData {
    std::string Name;
    int Count;
    double Price;
    double PercentMarkup;
};

int ExtractItemData(std::string Line, ItemData & Output) {
    std::istringstream Stream( Line );

    std::vector<std::string> Words( Stream.begin(), Stream.end() );

    if (Words.size() < 3) {
        /* somebody gave us a malformed line with less than needed words */
        return -1;
    }

    // Search from backwards, until you do not find anything that is not digits (0-9) or a whitespace
    std::size_t StartOfDigits = Words[0].find_last_not_of( VALID_DIGITS );

    if (StartOfDigits == std::string::npos) {
        /* error; your item name is invalid */
        return -2;
    }
    else {
        // Separate the string into 2 parts
        Output.Name = Words[0].substr(0, StartOfDigits); // Get the first part
        Output.Count = std::stoi( Words[0].substr(StartOfDigits, Words[0].length() - StartOfDigits) );
        Output.Price = std::stod( Words[1] );

        // Search from backwards, until we do not find anything that is not '%' or ' '
        std::size_t StartOfPercent = Words[2].find_last_not_of(VALID_PERCENTAGE);
        Output.PercentMarkup = std::stod( Words[2].substr(0, StartOfPercent) );
    }

    return 0;
}

如果未定义size_t,则代码要求包括sstreamvectorstringcstdint

希望答案很有用。
祝你好运,Colda。

PS .:我对堆栈溢出的第一个回答^^;

答案 1 :(得分:-1)

您可以迭代将数字推入向量的字符串,然后使用stringstream将其转换为整数