【问题标题】:C++ string split and manipulationC++ 字符串拆分和操作
【发布时间】: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”方法太慢的证据?

标签: c++ string split


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        相关资源
        最近更新 更多