从字符串 C++ 中提取某些整数

Posted

技术标签:

【中文标题】从字符串 C++ 中提取某些整数【英文标题】:Extracting certain integers from string C++ 【发布时间】:2018-10-06 21:46:36 【问题描述】:

祝大家今天好,

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

itemnameitemnumber 价格百分比标记

例子

长袍-u2285 24.22 37%

TwoB1Ask1-m1275 90.4 1%

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

我尝试了几种不同的方法,但是事实证明,某些项目名称的名称中包含整数,这超出了我的经验。

如果有人可以帮助我,我将非常感谢他们的时间和知识。

【问题讨论】:

向我们展示您的尝试。否则,您是在要求我们为您编写代码。 “我很难过”让读者无所适从。请发布您尝试过的内容并确定失败的地方。 我尝试了几种不同的方法 - 你的意思是像获取第一个项目,然后从右边开始向后搜索直到找到一个非数字?如果你这样做了,那么你就不会遇到数字与非数字混合的问题。 【参考方案1】:

早安,

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

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

当您将行拆分为单词时,例如通过将其迭代器赋予向量,或使用operator>> 读取它,您开始从倒数开始检查第一个单词,直到找到任何内容 那是不是"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

希望答案有用。 祝你好运,科尔达。

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于从字符串 C++ 中提取某些整数的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 从整数数组中插入和提取字符

C++ - 如何在字符串中提取有效字符串?

从字符串C++中取出整数[重复]

c++ 怎样提取一个字符串中的连续数字并放到另一个数组中保存? 急!

C++怎么从一行字符串中提取想要的数字,如m=45.5,D=0.15494,l=0.89989,A=1.803,C=0.161,提前45.5等数字

JAVA中如何从字符串中提取一个整数