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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Путаница в строках, Не пойму почему код глючит 
:(
    Опции темы
GrAndrey
Дата 2.11.2003, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот примерно такой код:
Код

main()
{
 char *str1 = (char *) malloc(2500);

 substr(temp, str1, 18, 31);

 free ( str1 );
}

void substr(char * newstr, char * str, int first, int last)
{
int i, len = StrLen(str);

newstr[0]='\0';
for (i=0; i<=last-first && i<len-first; ++i)
 newstr[i] = str[i+first];
newstr[i]='\0';
}

При отладке, примерно до момента, когда i=7, всё нормально. После этого, newstr приобретает значение str лежащее после first, а str претерпевает различные изменения. После строки newstr[i]='\0'; уже при закрытии блока, значение str равно куску newstr размером 6 букв.
Что происходит, и есть ли пути выделить подстроку лучше, чем такой?

Это сообщение отредактировал(а) GrAndrey - 2.11.2003, 15:06
PM MAIL   Вверх
neutrino
Дата 2.11.2003, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 
PM MAIL WWW ICQ Skype GTalk   Вверх
GrAndrey
Дата 2.11.2003, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всё равно str1 калечит sad.gif
PM MAIL   Вверх
frost
Дата 2.11.2003, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 20.10.2003
Где: г. Королёв М.о., м-рн Комитетский лес, д.5, кв.40

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



Я конечно ламо с ушами, а где у Вас объявляется temp? Она уже готова к работе? А то я не, извините за выражение, въехал.
PM MAIL   Вверх
GrAndrey
Дата 2.11.2003, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я объявляю temp сразу следом за str1. Я показал, что умею память выделать, и не вдавался в такие подробности.
Я просто не понимаю, почему происходят изменения со str1, когда я ей ничего нигде не присваиваю?!!! Может ли врать отладчик? Судя по его данным, со строками прям-таки чудеса творятся.
PM MAIL   Вверх
frost
Дата 2.11.2003, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 20.10.2003
Где: г. Королёв М.о., м-рн Комитетский лес, д.5, кв.40

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



Непонятно. А в строках то, что надо?, Вы память точно выделили динамически? Если нет, то может компилятор Same strings merge'ит? Больше ничего придумать не могу.

Это сообщение отредактировал(а) frost - 2.11.2003, 21:16
PM MAIL   Вверх
DENNN
Дата 3.11.2003, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Цитата
Я показал, что умею память выделать, и не вдавался в такие подробности.

Раз такие вещи происходят- значит в все же где-то в коде ошибка. Неплохо бы весь кусок привести. Кроме того, можно заглянуть в справку по поводу команд memset и memcpy ;)
PM ICQ   Вверх
Albinos
Дата 3.11.2003, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2neutrino:

Цитата
void substr(char* newstr, char* str, int first, int last) {
int i;
for (i=first; (i<=last)&&(newstr[i-first]=str[i]); i++);
}


А вот так писать не хорошо.
PM MAIL   Вверх
GrAndrey
Дата 3.11.2003, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот код. Совершенно левое удалил. Функция substr приведена дословно. mbx вызывает messageBox.
Пишу в C++ Builder 6.0.
Код

{
 char *str1 = (char *) malloc(2500);
 char *str2 = (char *) malloc(2500);
 char *tempstr = (char *) malloc(2500);

 
 str1 = ListBox1->Items->Strings[ListBox1->ItemIndex-ListBox1->ItemIndex%3+1].c_str();
 if (str1!="")
  {
   if (strlen(str1)==70) mbx("Неверная длинна строки данных. ");
   else
   {
    if (str1[0]=='1' && isdigits(str1,18,22))
    {
     char * temp = (char *) malloc(2500);
     char * temp1 = (char *) malloc(2500);
     int sum=0;

     substr(temp, str1, 18, 31);
     LabeledEdit6->Text = temp;

     temp[0]='\0';

     substr(temp1, str1, 33, 33);
     if (temp1[0]=='-' || temp1[0]=='+')
      strcpy(temp, temp1);
     strcat(temp, "0");
     substr(temp1, str1, 34, 42);
     strcat(temp, temp1);
     LabeledEdit7->Text=temp;

     free(temp);
     free(temp1);
    }
    else mbx("Неверный формат данных. ");
   }
  }
  else mbx("Первая строка данных пуста.");

 free (str1);
 free (tempstr);
}

PM MAIL   Вверх
bel_nikita
Дата 4.11.2003, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Есть функция char *strtok(char *str1, const char *str2); которая позволяет разбить строку до составляющих ее частей.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Ars
Дата 4.11.2003, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



У тебя неверная работа со строками:
1.
Код
str1 = ListBox1->Items->Strings[ListBox1->ItemIndex-ListBox1->ItemIndex%3+1].c_str();

тут же теряется указатель на ранее выделенную память
надо так:
Код
strcpy(str1,ListBox1->Items->Strings[ListBox1->ItemIndex-ListBox1->ItemIndex%3+1].c_str());

2.
Код
if (str1!="")
всегда будет true
надо так:
Код
if (strcmp(str1,"")==0) или
if(str1[0]=='<!--POST BOX-->')

3. Указатель, возвращаемый функцией .c_str() - временный. При выходе из области видимости или при изменении AnsiString он теряет валидность. У тебя что-то подобное и происходит, а память для temp выделяется по адресу немного раньше, чем str1, после чего в substr происходит обычный наезд на память str1 (уже освобожденную и заново выделенную для temp)

Аккуратней работай со строками - char* не строка, а всего лишь указатель...
В AnsiString есть ф-ция выделения подстроки:
Код
LabeledEdit6->Text = ListBox1->Items->Strings[ListBox1->ItemIndex-ListBox1->ItemIndex%3+1].
   SubString(19,14)



--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
neutrino
Дата 4.11.2003, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Цитата(Albinos @ 3.11.2003, 18:48)
2neutrino:

Цитата
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 
PM MAIL WWW ICQ Skype GTalk   Вверх
Albinos
Дата 4.11.2003, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну если i = -1, например, то проверки не произойдет - вылетит раньше, в память чужую залезешь...

Или "Index is out of bounds" крикнет.
PM MAIL   Вверх
GrAndrey
Дата 4.11.2003, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Благодарю всех, а Ars особенно. Надеюсь, всё теперь будет хорошо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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