我负责帮助一年级学生学习这个课程,我们需要在一个字符串中找到一个单词,用另一个单词来改变它。我这样写了
#include <iostream>
#include <string>
using namespace std;
void changeWord(string &texto, string wordB, int pos, int sizeA)
{
int auxi;
string antes, depois;
for(auxi = 0; auxi < pos; auxi++)
{
antes[auxi] = texto[auxi];
cout<< "Antes["<< auxi<< "]: "<< antes[auxi]<< endl;
}
for(auxi = 0; auxi+pos+sizeA < texto.length(); auxi++)
{
depois[auxi] = texto[auxi+pos+sizeA];
cout<< "Depois["<< auxi<< "]: "<< depois[auxi]<< endl;
}
cout<< "Antes: "<< antes<< " Depois: "<< depois<< endl;
texto = antes + wordB + depois;
cout<< "Texto:"<< texto<< endl;
}
void findWord(string texto, string wordA, string wordB)
{
int auxi;
for(auxi = 0; auxi < texto.length(); auxi++)
{
cout<< "texto["<< auxi<< "]: "<< texto[auxi]<<" wordA[0]: "<< wordA[0]<< endl;
if(texto[auxi] == wordA[0])
{
int auxj;
for(auxj = 1; auxj < wordA.length() && texto[auxi+auxj] == wordA[auxj]; auxj++)
{
cout<< "texto["<< auxi+auxj<< "]: "<< texto[auxi+auxj]<< " wordA["<< auxj<< "]: "<< wordA[auxj]<< endl;
}
if(auxj == wordA.length())
{
changeWord(texto, wordB, auxi, wordA.length());
}
}
}
}
int main()
{
string texto = "Isto_e_um_texto_qualquer";
string wordA, wordB;
cin >>wordA;
cin >>wordB;
findWord(texto, wordA, wordB);
return 0;
}
我希望这可以工作,并且在某种程度上它会完成我想要的工作,直到函数调用&#39; changeWord()&#39;当我尝试输出两个&#39; antes&#39;和&#39; depois&#39;字符串。
这些在各自的循环中工作,打印以筛选预期的char:
cout<< "Antes["<< auxi<< "]: "<< antes[auxi]<< endl;
cout<< "Depois["<< auxi<< "]: "<< depois[auxi]<< endl;
这不是:
cout<< "Antes: "<< antes<< " Depois: "<< depois<< endl;
两个&#39; antes&#39;和&#39; depois&#39;打印为空白。此外,程序在到达此行时崩溃:
texto = antes + wordB + depois;
我认为这是因为它不能在前一行打印它们。 我做错了什么?
答案 0 :(得分:3)
您的代码中有undefined behavior。
您将antes
和depois
声明为空字符串,然后您就可以了。
antes[auxi] = texto[auxi];
使用哪个索引并不重要,对于空字符串antes
,它仍然是越界。
在该特定循环中,您从零开始索引,因此您可以改为追加:
antes += texto[auxi];
或者使用substr
函数代替循环:
antes = texto.substr(0, auxi);
不要谈论现有的replace
功能。
答案 1 :(得分:2)
我们需要在字符串中找到一个单词,然后用另一个给定的单词对其进行更改。
我建议您使用std::string
的内置功能为您做出艰苦的工作吗?
std::string s = "a phrase to be altered";
std::string to_replace = "phrase";
std::string replacement = "sentence";
size_t pos = s.find(to_replace);
if (pos != std::string::npos)
s.replace(pos, to_replace.length(), replacement);