我遇到了一个问题。
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代码值然后它执行加法操作。它给了我一些奇怪的信。
答案 0 :(得分:2)
您没有在字符串中插入任何内容。相反,你实际上调用字符元素的+=
运算符,而不是字符串(它最后只能追加到最后一个)。
您实际想要做的是 将元素插入字符串。在您的示例中,最简单的方法是替换
word.at(i)+='r';
与
word.insert(word.begin()+(++i), 'r');
在您找到的'r'
后插入'a'
。
但是,请注意,由于可能的重新分配,以这种方式插入字符可能会使任何迭代器无效。在您的情况下,这不是一个问题,因为您使用基于索引的迭代并检查每次迭代中字符串的(可能增加的)大小,但这是值得记住的。
答案 1 :(得分:1)
word.at(i) += 'r';
正在将位置i
的字符更改为其他值。 不将<{1}}插入字符串。
如果您平台上r
为char
,那么根据您的编码,您的程序行为未定义添加{{ 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;