C++ 字符串拆分和操作
Posted
技术标签:
【中文标题】C++ 字符串拆分和操作【英文标题】:C++ string split and manipulation 【发布时间】:2014-06-25 14:59:35 【问题描述】:字符串都是这样的:
string s="name_number";
我想把名字和数字分开,得到两个字符串“名字”和“数字”。然后我需要号码做加法:
int new_number=number+10;
并使用“name_newnumber”重建字符串。 有没有一种聪明而快速的方法来做到这一点?它是具有实时限制的程序,因此它应该尽可能快。我只提出了 split 或 find_first_of 但我想知道是否有更好的方法
【问题讨论】:
大概number
是由数字组成的,没有拼出来?
他得到了一个字符串“name_10”,需要将其更改为“name_11”、“name_12”等。获取下划线的位置并将下划线的位置+1转换为int,添加您的值并创建一个新字符串。
加快速度应该不会太糟糕。取最后一个字符,增加它,占'9'
-> '0'
,如果发生这种情况,向左移动。重复,如果没有数字,则插入'1'
。
到目前为止你尝试过什么?在寻求帮助之前,您做了哪些研究?
我知道这听起来很陈旧,但是:您是否分析了您的程序并找到了证明天真的“find_first_of”方法太慢的证据?
【参考方案1】:
您可以使用std::istringstream
轻松提取所有内容:
std::istringstream iss(s);
std::string name;
std::getline(iss, name, '_');
int number;
iss >> number;
然后用number
做任何你想做的事情来得到newnumber
,然后再次将它们连接在一起:
std::string newstring = name + "_" + std::to_string(newnumber);
不过,这可以通过更多的错误检查轻松完成(例如,如果流提取失败)。
【讨论】:
【参考方案2】:尝试以下想法。
#include <iostream>
#include <string>
int main()
std::string s = "name_5";
std::cout << s << std::endl;
std::string::size_type n = s.rfind( '_' );
if ( n != std::string::npos )
s.replace( n + 1, std::string::npos,
std::to_string( std::stoi( s.substr( n + 1 ) ) + 10 ) );
std::cout << s << std::endl;
return 0;
输出是
name_5
name_15
考虑到我使用方法rfind
而不是find
。在这种情况下,名称可能包含嵌入的下划线。
例如,如果您将字符串初始化为
std::string s="Main_Name_ 5";
你会得到
Main_Name_ 5
Main_Name_15
【讨论】:
【参考方案3】:这样的事情应该可以解决问题
std::string abc = "name_10";
std::string name = abc.substr(0, abc.find('_'));
int i = std::stoi(abc.substr(abc.find('_') + 1));
// change i
++i;
abc = name + '_' + std::to_string(i);
【讨论】:
以上是关于C++ 字符串拆分和操作的主要内容,如果未能解决你的问题,请参考以下文章