在字符串之间插入字符

时间:2018-04-10 16:26:19

标签: c++ string

我今天面临着一个简单而复杂的挑战。

在我的程序中,我希望每三个字符串插入一个-个字符。这将如何实现?谢谢你的帮助。

#include <iostream>

int main()
{
    std::string s = "thisisateststring";

    // Desired output: thi-sis-ate-sts-tri-ng
    std::cout << s << std::endl;
    return 0;
}

6 个答案:

答案 0 :(得分:2)

无需“构建新字符串”。

循环位置迭代,从3开始,每次传递递增 4 ,在指示的位置插入-。当下一个插入点突破字符串时停止(每次传递都会增加一个字符串,因此需要跳过4个插槽):

#include <iostream>
#include <string>

int main()
{
    std::string s = "thisisateststring";

    for (std::string::size_type i=3; i<s.size(); i+=4)
        s.insert(i, 1, '-');

    // Desired output: thi-sis-ate-sts-tri-ng
    std::cout << s << std::endl;
    return 0;
}

<强>输出

thi-sis-ate-sts-tri-ng

答案 1 :(得分:1)

一种通用(高效)的方法是通过在现有字符串上逐个字符地迭代来构建新字符串,随时进行任何所需的更改。在这种情况下,每隔三个字符就可以插入一个连字符:

use of deleted function 'std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator=(const std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]'

答案 2 :(得分:1)

只需取一个空字符串,并在每个可被3整除的计数中附加“ - ”

#include <iostream>

int main()
{
    std::string s = "thisisateststring";
    std::string res="";
    int count=0;
    for(int i=0;i<s.length();i++){
        count++;
        res+=s[i];
        if(count%3==0){
            res+="-";
        }
    }
    std::cout << res << std::endl;
    return 0;
}

输出

thi-sis-ate-sts-tri-ng

答案 3 :(得分:0)

简单。迭代字符串并构建一个新字符串

将旧字符串中的每个字符复制到新字符串中,每次复制3个字符时,都要添加额外的字符 - &#39; - &#39;到新字符串的末尾并重新开始复制​​字符的数量。

答案 4 :(得分:0)

与99%的文字问题一样,这个问题可以通过regular expression单行解决:

std::regex_replace(input, std::regex{".{3}"}, "$&-")

但是,它不会带来一个问题,而是两个新问题:

  • 这不是一个非常高效的解决方案
  • 正则表达式库是巨大的,膨胀导致二进制

所以请三思而后行。

答案 5 :(得分:0)

您可以编写一个简单的仿函数来添加连字符,如下所示:

#include <iostream>

struct inserter
{
    unsigned n = 0u;
    void operator()(char c)
    {
        std::cout << c;
        if (++n%3 == 0) std::cout << '-';
    }
};

这可以传递给标准for_each()算法:

#include <algorithm>

int main()
{
    const std::string s = "thisisateststring";
    std::for_each(s.begin(), s.end(), inserter());
    std::cout << std::endl;
}

练习:扩展此类以使用不同的间隔,输出流,替换字符和字符串类型(窄或宽)。