Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Пожалуйста помогите разобраься.


Автор: Atij 13.4.2008, 15:57
Добрый день. У меня возникла следующая проблема: я написал программу кот-ая удаляет все подстроки из строки, она работает нормально до того момента пока я не ввиду подстроку идентичную строке, в "output" выводится "Borland C++ - Copyright 1991 Borland Intl.", и после этого прога не работает даже для тех случаев для кот-ых работала раньше, помогите пожалуйста разобраться в чём проблема. Вот код:

Код


#include <fstream.h>
#include <string.h>
#include <stdio.h>

ifstream input("input.txt", ios::in);
ofstream output("output.txt", ios::out);

void delete_str(char* str1, char* str2, char* str3)
{
    char *ptr = NULL;

    str3[0] = '\0';

    while ( ptr != strstr(str1, str2))
    {
    ptr=strstr(str1,str2);
    strncat(str3, str1, ptr - str1);
    str1 = ptr + strlen(str2);
    }

strcat(str3, str1);

output<<"obrazovannaya stroka:"<<endl<<str3;

}

int main()
{

    char str3[256];
    char str1[256], str2[256];

    input>>str1;
    output<<"izhodnaya stroka:"<<endl<<str1<<endl;
    input>>str2;
    output<<"izhodnaya podstroka:"<<endl<<str2<<endl;

    delete_str(str1,str2,str3);

    return 0;
}

Автор: baldina 13.4.2008, 16:02
"Borland C++ - Copyright 1991 Borland Int" эта строка находится по адресу 0.  smile 

Код

ptr=strstr(str1,str2);


в случае, если подстрока не найдена, ptr станет равным 0. Ты это не проверяешь.

Добавлено через 1 минуту и 15 секунд
Код

ptr != strstr(str1, str2)
странное условие, не правда ли?

Добавлено через 3 минуты и 26 секунд
Код

while  ((ptr = strstr(str1, str2)) != 0)
{
    strncat(str3, str1, ptr - str1);
    str1 = ptr + strlen(str2);
}

Автор: Atij 13.4.2008, 16:51
Большое спасибо, вот только ещё один вопрос, если допустим я ввиду в строку 1234567812345678.... и.т.д много-много раз, а в подстроку ввиду 1234567, почему в какойто момент  выводится не только 8-ки но и вся остальная последовательность? И как это ибежать? Ещё раз спасибо за помощь и внимаие)

Автор: baldina 13.4.2008, 17:59
"много-много раз" не превышает установленную максимальную длину строки?

Автор: Atij 13.4.2008, 18:11
Привышает, в том тои дело, что вроде максимальная длина строки объявлена, а считывние продолжается =(

Автор: LexRema 14.4.2008, 19:41
Поставить на место максимального елемента  заслуженный ноль str3[255] = '\0'; ПОСЛЕ окончания циклаsmile... Если я правильно понял.

Автор: baldina 15.4.2008, 10:36
LexRema, ты понял неправильно. Происходит запись в чужую память, за пределами 255.

Atij, воспользуйся строками С++ std::string. Для них память распределяется динамически, есть операторы << и >>, а так же твоя функция станет проще, что-то вроде

Код

void delete_substr(std::string& str, const std::string& substr)
{
    size_t count = substr.size();
    size_t pos;

    while ((pos = str.find (substr)) != std::string::npos)
        str.erase (pos, count);
}


Добавлено через 6 минут и 45 секунд
вообще-то у тебя BC3.1, там нет STL. Но зато там есть своя библиотека, в т.ч. класс String. Можешь его использовать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)