在C ++中使用字符串(在字符串中搜索,拆分字符串,cout<< string)

时间:2014-05-20 12:44:42

标签: c++ string cout

我负责帮助一年级学生学习这个课程,我们需要在一个字符串中找到一个单词,用另一个单词来改变它。我这样写了

#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;

我认为这是因为它不能在前一行打印它们。 我做错了什么?

2 个答案:

答案 0 :(得分:3)

您的代码中有undefined behavior

您将antesdepois声明为字符串,然后您就可以了。

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);