如何将字符串与一个字符交织?

时间:2019-05-10 17:29:52

标签: c++

我需要编写一个函数,例如将"string"替换为"s't'r'i'n'g"

我将字符串添加到数组中,...接下来是什么?

我的代码:

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    string x;
    cout << "Type a string: ";
        cin >> x;
    char array[x.length()];

    for (int i = 0; i < sizeof(array); i++) {
        array[i] = x[i];
        cout << array[i];
    }
}

1 个答案:

答案 0 :(得分:2)

  

我将字符串添加到数组

这是您的第一个错误。在C ++中,您不使用数组作为字符串,而是使用std::string

  

然后...接下来是什么?

Dunnno?写代码?

#include <string>
#include <iostream>

void interlace(std::string &str, char ch)
{
    for (std::size_t pos{ 1 }; pos < str.length(); pos += 2)
        str.insert(pos, 1, ch);
}

int main()
{
    std::string foo{ "string" };
    interlace(foo, '\'');
    std::cout << foo << '\n';
}

输出:

s't'r'i'n'g

可能的优化:

根据Remy Lebeau的建议,interlace()可以确保它的参数str在进入for循环之前保留了足够的内存,以避免在循环内重新分配:

void interlace(std::string &str, char ch)
{
    auto length{ str.length() };

    if (length < 2)  // nothing to do
        return;

    str.reserve(2 * length - 1);  // We insert a character after every character of str
                                  // but the last one. eg. length == 3 -> 2 * 3 - 1

    for (std::size_t pos{ 1 }; pos < str.length(); pos += 2)
        str.insert(pos, 1, ch);
}

顺便说一句:

  • 请注意:<string>,而不是<string.h>。如果您真的需要C语言的字符串函数(std::strlen()std::strcpy(),...),它们就在C ++中的<cstring>中。

  • 更好地放弃using namespace std;的习惯,因为它将std中的所有标识符插入到全局名称空间中,这很容易导致标识符冲突。对于很小的程序,这可能没问题,但是...

  • 那个:

    char array[x.length()];
    

    不是合法的C ++。数组大小必须是编译时常量。您在这里使用的是gcc语言扩展。你不应该这些东西称为VLA(可变长度数组),它是C的功能。当您需要某些行为类似于数组但具有动态大小的东西时,请使用std::vector<>