在字符串中添加字符

时间:2017-08-07 11:55:54

标签: c++

我遇到了一个问题。

r.put('/' + key + '/:id', async (ctx, next) => {
  console.log(key) // Outputs locks
  console.log(ctx.request.body) // Same as before
  await ctx.db
    .collection(key)
    .replaceOne({ _id: objectId(ctx.params.id) }, ctx.request.body)
  ctx.body = { _id: ctx.params.id }
})

我想做的就是输入例如: if (response != null) {CarResponseBody body= new CarResponseBody(); if (response.raw().code() == 200 && response.body()!=null) { body = response.body();if(body.getCar()!=null){ CarResponse car =body.getCar()}}} ,输出应为#include <iostream> using namespace std; int main(){ string word; cout << "Enter word: "; cin >> word; int i = 0; do { if (word.at(i) == 'a') { word.at(i) += 'r'; } i++; } while(i < word.size()); cout << word << endl; return 0; } 。 换句话说,每次找到字符racket时,程序都应该为其添加字符rarcket

我认为程序获取每个字母的ASCII代码值然后它执行加法操作。它给了我一些奇怪的信。

7 个答案:

答案 0 :(得分:2)

您没有在字符串中插入任何内容。相反,你实际上调用字符元素+=运算符,而不是字符串(它最后只能追加到最后一个)。

您实际想要做的是 元素插入字符串。在您的示例中,最简单的方法是替换

word.at(i)+='r';

word.insert(word.begin()+(++i), 'r');

在您找到的'r'后插入'a'

但是,请注意,由于可能的重新分配,以这种方式插入字符可能会使任何迭代器无效。在您的情况下,这不是一个问题,因为您使用基于索引的迭代并检查每次迭代中字符串的(可能增加的)大小,但这是值得记住的。

答案 1 :(得分:1)

word.at(i) += 'r';正在将位置i的字符更改为其他值。 将<{1}}插入字符串。

如果您平台上rchar,那么根据您的编码,您的程序行为未定义添加{{ 1}}到signed可能会溢出'r'类型! 'a'signed只是'a'类型的数字文字。为方便起见,提供了这种表示法,以使代码清晰易用。

如果您想插入一个实际角色,请使用'r'

char

会这样做,我已经注意再次增加std::string::insert以跳过刚添加的角色。

参考:http://en.cppreference.com/w/cpp/string/basic_string/insert

答案 2 :(得分:1)

您应该使用string::insert

以下代码适用于您的示例:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string word;
    cout << "Enter word: ";
    cin >> word;
    int i = 0;
    do {
        if (word.at(i) == 'a') {
            word.insert(i + 1, "r");
        }
        i++;
    } while (i<word.size());
    cout << word << endl;
    return 0;
}

答案 3 :(得分:0)

if(word.at(i)=='a'){
    word.at(i)+='r';
}

上面的代码不符合你的想法。它将'a'的数字表示与'r'相加,并将其存储在索引i中。假设结果符合您平台上char的类型。

您可以std::string::insert进入字符串中的特定位置,但可能更好只使用新字符串: - 您可以将字符串的每个字符复制到另一个字符串(追加)飞行中的额外角色。)

std::string word;
std::string newWord;
std::cout << "Enter word: ";
std::cin >> word;
for(int i = 0; i < word.size(); i++)
    newWord += word[i];
    if(word[i] == 'a')
        newWord += 'r';
}
std::cout << newWord << std::endl; 

编辑: 如上所述,上述工作正常,因为std::string +=的{​​{1}}运算符超载char

答案 4 :(得分:0)

首次出现后插入

auto search = 'a';
auto insert = 'b';
for(auto i = word.begin(), e = word.end(); i < e; ++i)
  if(*i == search) {
    word.insert(i + 1, insert);
    return;
  }

每次出现后插入

auto search = 'a';
auto insert = 'b';
for(auto i = word.begin(), e = word.end(); i < e; ++i)
  if(*i == search) {
    i = word.insert(i + 1, insert);
    e = word.end();
  }

答案 5 :(得分:0)

对于初学者,您应该明确包含标题<string>

#include <string>

因为根据C ++标准,标题<iostream>不一定包含标题<string>

您可以像其他人所建议的那样使用类insert的方法std::string。然而,这种方法效率很低,因为可能会有很多子串的移动和字符串占用的内存的重新分配。

在我看来,直接的方法会更有效率。

这是一个示范程序:

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string word;

    std::cout << "Enter word: ";

    std::cin >> word;

    std::string::size_type n = std::count(word.begin(), word.end(), 'a');

    if (n)
    {
        auto m = word.size();
        word.resize( m + n);

        for (auto i = m; n != 0; )
        {
            if (word[--i] == 'a')
            {
                word[i + n--] = 'r';
            }
            word[i + n] = word[i];
        }
    }

    std::cout << word << std::endl;

    return 0;
}

答案 6 :(得分:0)

当你做

 word.at(i) = 'r'; 

您实际上是将位置 i 的字符更改为其他值。

如果你需要在单词对象的给定索引处追加/添加一个字符串,那么执行

word.insert(1, "!");

示例:

std::string word{"HelloXoce"};

std::cout << "Word: " << word << std::endl;
word.at(0) = 'X';
std::cout << "Word: " << word << std::endl;
word.insert(1, "!");
std::cout << "Word: " << word << std::endl;