![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
GrAndrey |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 2.7.2003 Репутация: нет Всего: 1 |
Вот примерно такой код:
При отладке, примерно до момента, когда i=7, всё нормально. После этого, newstr приобретает значение str лежащее после first, а str претерпевает различные изменения. После строки newstr[i]='\0'; уже при закрытии блока, значение str равно куску newstr размером 6 букв. Что происходит, и есть ли пути выделить подстроку лучше, чем такой? Это сообщение отредактировал(а) GrAndrey - 2.11.2003, 15:06 |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 1 Всего: 62 |
void substr(char* newstr, char* str, int first, int last) {
int i; for (i=first; (i<=last)&&(newstr[i-first]=str[i]); i++); } -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
GrAndrey |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 2.7.2003 Репутация: нет Всего: 1 |
Всё равно str1 калечит
![]() |
|||
|
||||
frost |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 20.10.2003 Где: г. Королёв М.о., м-рн Комитетский лес, д.5, кв.40 Репутация: нет Всего: нет |
Я конечно ламо с ушами, а где у Вас объявляется temp? Она уже готова к работе? А то я не, извините за выражение, въехал.
|
|||
|
||||
GrAndrey |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 2.7.2003 Репутация: нет Всего: 1 |
Я объявляю temp сразу следом за str1. Я показал, что умею память выделать, и не вдавался в такие подробности.
Я просто не понимаю, почему происходят изменения со str1, когда я ей ничего нигде не присваиваю?!!! Может ли врать отладчик? Судя по его данным, со строками прям-таки чудеса творятся. |
|||
|
||||
frost |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 20.10.2003 Где: г. Королёв М.о., м-рн Комитетский лес, д.5, кв.40 Репутация: нет Всего: нет |
Непонятно. А в строках то, что надо?, Вы память точно выделили динамически? Если нет, то может компилятор Same strings merge'ит? Больше ничего придумать не могу.
Это сообщение отредактировал(а) frost - 2.11.2003, 21:16 |
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Раз такие вещи происходят- значит в все же где-то в коде ошибка. Неплохо бы весь кусок привести. Кроме того, можно заглянуть в справку по поводу команд memset и memcpy ;) |
|||
|
||||
Albinos |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 11.10.2003 Репутация: нет Всего: 3 |
2neutrino:
А вот так писать не хорошо. |
|||
|
||||
GrAndrey |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 2.7.2003 Репутация: нет Всего: 1 |
Вот код. Совершенно левое удалил. Функция substr приведена дословно. mbx вызывает messageBox.
Пишу в C++ Builder 6.0.
|
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Есть функция char *strtok(char *str1, const char *str2); которая позволяет разбить строку до составляющих ее частей.
|
|||
|
||||
Ars |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
У тебя неверная работа со строками:
1.
тут же теряется указатель на ранее выделенную память надо так:
2.
надо так:
3. Указатель, возвращаемый функцией .c_str() - временный. При выходе из области видимости или при изменении AnsiString он теряет валидность. У тебя что-то подобное и происходит, а память для temp выделяется по адресу немного раньше, чем str1, после чего в substr происходит обычный наезд на память str1 (уже освобожденную и заново выделенную для temp) Аккуратней работай со строками - char* не строка, а всего лишь указатель... В AnsiString есть ф-ция выделения подстроки:
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
||||||||||
|
|||||||||||
neutrino |
|
||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 1 Всего: 62 |
Чего тут нехорошего? Усе ОК. -------------------- The truth comes from within ... Покойся с миром, Vit |
||||
|
|||||
Albinos |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 11.10.2003 Репутация: нет Всего: 3 |
Ну если i = -1, например, то проверки не произойдет - вылетит раньше, в память чужую залезешь...
Или "Index is out of bounds" крикнет. |
|||
|
||||
GrAndrey |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 2.7.2003 Репутация: нет Всего: 1 |
Благодарю всех, а Ars особенно. Надеюсь, всё теперь будет хорошо.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |