Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пожалуйста помогите разобраься. Видимо проблемы с памятью. 
:(
    Опции темы
Atij
Дата 13.4.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Добрый день. У меня возникла следующая проблема: я написал программу кот-ая удаляет все подстроки из строки, она работает нормально до того момента пока я не ввиду подстроку идентичную строке, в "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;
}

PM MAIL   Вверх
baldina
Дата 13.4.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



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

PM MAIL   Вверх
Atij
Дата 13.4.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Большое спасибо, вот только ещё один вопрос, если допустим я ввиду в строку 1234567812345678.... и.т.д много-много раз, а в подстроку ввиду 1234567, почему в какойто момент  выводится не только 8-ки но и вся остальная последовательность? И как это ибежать? Ещё раз спасибо за помощь и внимаие)
PM MAIL   Вверх
baldina
Дата 13.4.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



"много-много раз" не превышает установленную максимальную длину строки?
PM MAIL   Вверх
Atij
Дата 13.4.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Привышает, в том тои дело, что вроде максимальная длина строки объявлена, а считывние продолжается =(
PM MAIL   Вверх
LexRema
Дата 14.4.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Поставить на место максимального елемента  заслуженный ноль str3[255] = '\0'; ПОСЛЕ окончания циклаsmile... Если я правильно понял.
PM   Вверх
baldina
Дата 15.4.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



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. Можешь его использовать.

Это сообщение отредактировал(а) baldina - 15.4.2008, 10:38
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0715 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.