从字符串 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,代码要求包括 sstream
、vector
、string
和 cstdint
希望答案有用。 祝你好运,科尔达。
PS.: 我对堆栈溢出的第一个答案 ^^;
【讨论】:
【参考方案2】:您可以迭代将数字推送到向量的字符串,然后使用 stringstream 将它们转换为整数
【讨论】:
以上是关于从字符串 C++ 中提取某些整数的主要内容,如果未能解决你的问题,请参考以下文章
c++ 怎样提取一个字符串中的连续数字并放到另一个数组中保存? 急!
C++怎么从一行字符串中提取想要的数字,如m=45.5,D=0.15494,l=0.89989,A=1.803,C=0.161,提前45.5等数字