Как вы используете string.erase и string.find? - PullRequest
0 голосов
/ 15 марта 2011

Почему я не могу вызвать string.find в string.erase следующим образом: str.erase(str.find(a[1]),str.size())?edit: code добавлен

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

// html tags
string tags[5]={"<!--...-->","<!DOCTYPE>","<a>","<abbr>","<acronym>"};
//

//check if string exists
int boolStringExists(string a, string b)
{
    if(a.find(b)>0)
    {
        return 1;
    }
    if(a.find(b)<=0)
    {
        return 0;
    }

}
//erase tag from string a
void eraseTags(string a,string b[])
{

    for(int i=0; i<5;i++)
    {
        int x=(boolStringExists(a,b[i]));
        while (x>0)
        {
            a.erase(a.find(b[i]),b[i].size());
            x=(boolStringExists(a,b[i]));
        }
    }
}
int _tmain(int argc, _TCHAR* argv[])
{    
    fstream file;
    file.open("h:\\a.htm");
    string k,m;



    while(getline(file, k))
        m += k ;


    eraseTags(m,tags);


    return 0;
}

Появляется это сообщение: «это приложение запросило среду выполнения, чтобы завершить его необычным способом. Пожалуйста, обратитесь в службу поддержки приложения для получения дополнительной информации.»

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

Если строка не найдена, find возвращает string::npos, и тогда ваш код не будет работать и выдаст ошибку времени выполнения.Видите, это дает ошибку: https://ideone.com/NEhqn

Так что лучше напишите это:

size_t pos = str.find(a[1]);
if ( pos != std::string::npos)
   str.erase(pos); //str.size() is not needed!

Теперь это не дает ошибки: https://ideone.com/IF2Hy

1 голос
/ 15 марта 2011

Кажется, вы хотите стереть все, что идет после str.find (a [1]). В этом случае вы можете опустить второй аргумент.

#include <iostream>
#include <string>

int main(int argc, char *argv[]) {
        std::string str = "Hello, world!";
        std::string needle = "o,";
        str.erase(str.find(needle));
        std::cout << str << "\n";
}

В этом примере я использовал needle вместо a[1], но принцип тот же.

1 голос
/ 15 марта 2011

В этом вызове нет ничего плохого (при условии, что a[1] существует и найден в str хотя бы один раз)

#include <iostream>
#include <string>
int main()
{
        std::string str = "Hello, world!";
        std::string a = "wwwwww";
        str.erase(str.find(a[1]), str.size());
        std::cout << str << '\n';
}

тестовый прогон: https://ideone.com/8wibR

РЕДАКТИРОВАТЬ: Ваш полный исходный код не может проверить, действительно ли b[1] находится в str. Функция boolStringExists() возвращает 1, если a.find(b) больше нуля, а значение std::string::npos, которое возвращается, когда b не найдено в a, больше нуля.

Чтобы исправить это, не затрагивая остальную часть вашей логики, измените эту функцию на

//check if string exists
bool boolStringExists(string a, string b)
{
    return a.find(b) != string::npos;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...