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++ 字符串拆分和操作的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中拆分字符串

在 C++ 中用字符串和 int 解析(拆分)一个 txt 文件

在 C++ 中拆分字符串的最佳实践

拆分字符串的最佳方法是啥? (c++) [重复]

使用 C++ 拆分字符串 [重复]

使用 C++ 中的特殊格式将字符串拆分为字符串