Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Путаница в строках |
Автор: GrAndrey 2.11.2003, 15:04 | ||
Вот примерно такой код:
При отладке, примерно до момента, когда i=7, всё нормально. После этого, newstr приобретает значение str лежащее после first, а str претерпевает различные изменения. После строки newstr[i]='\0'; уже при закрытии блока, значение str равно куску newstr размером 6 букв. Что происходит, и есть ли пути выделить подстроку лучше, чем такой? |
Автор: neutrino 2.11.2003, 15:33 |
void substr(char* newstr, char* str, int first, int last) { int i; for (i=first; (i<=last)&&(newstr[i-first]=str[i]); i++); } |
Автор: GrAndrey 2.11.2003, 16:37 |
Всё равно str1 калечит ![]() |
Автор: frost 2.11.2003, 19:47 |
Я конечно ламо с ушами, а где у Вас объявляется temp? Она уже готова к работе? А то я не, извините за выражение, въехал. |
Автор: GrAndrey 2.11.2003, 21:02 |
Я объявляю temp сразу следом за str1. Я показал, что умею память выделать, и не вдавался в такие подробности. Я просто не понимаю, почему происходят изменения со str1, когда я ей ничего нигде не присваиваю?!!! Может ли врать отладчик? Судя по его данным, со строками прям-таки чудеса творятся. |
Автор: frost 2.11.2003, 21:16 |
Непонятно. А в строках то, что надо?, Вы память точно выделили динамически? Если нет, то может компилятор Same strings merge'ит? Больше ничего придумать не могу. |
Автор: DENNN 3.11.2003, 11:31 | ||
Раз такие вещи происходят- значит в все же где-то в коде ошибка. Неплохо бы весь кусок привести. Кроме того, можно заглянуть в справку по поводу команд memset и memcpy ;) |
Автор: Albinos 3.11.2003, 19:48 | ||
2neutrino:
А вот так писать не хорошо. |
Автор: GrAndrey 3.11.2003, 20:26 | ||
Вот код. Совершенно левое удалил. Функция substr приведена дословно. mbx вызывает messageBox. Пишу в C++ Builder 6.0.
|
Автор: bel_nikita 4.11.2003, 10:41 |
Есть функция char *strtok(char *str1, const char *str2); которая позволяет разбить строку до составляющих ее частей. |
Автор: Ars 4.11.2003, 12:11 | ||||||||||
У тебя неверная работа со строками: 1.
тут же теряется указатель на ранее выделенную память надо так:
2.
надо так:
3. Указатель, возвращаемый функцией .c_str() - временный. При выходе из области видимости или при изменении AnsiString он теряет валидность. У тебя что-то подобное и происходит, а память для temp выделяется по адресу немного раньше, чем str1, после чего в substr происходит обычный наезд на память str1 (уже освобожденную и заново выделенную для temp) Аккуратней работай со строками - char* не строка, а всего лишь указатель... В AnsiString есть ф-ция выделения подстроки:
|
Автор: neutrino 4.11.2003, 16:51 | ||||
Чего тут нехорошего? Усе ОК. |
Автор: Albinos 4.11.2003, 17:03 |
Ну если i = -1, например, то проверки не произойдет - вылетит раньше, в память чужую залезешь... Или "Index is out of bounds" крикнет. |
Автор: GrAndrey 4.11.2003, 17:08 |
Благодарю всех, а Ars особенно. Надеюсь, всё теперь будет хорошо. |