Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2012, 13:40   #1
Aleks2215
Пользователь
 
Регистрация: 19.09.2010
Сообщений: 30
Вопрос strtok

Возникла необходимость разобрать строку. Воспользовался функцией strtok. Т.к. она уничтожает строку, которую парсит, то я пытался сохранить ее для работы в дальнейшем, но не получилось. Вот код:
Код:
 AnsiString str,mem;
 str="0#123#100";
 char *temp;
 mem=str;
 temp=strtok(str.c_str(),"#");
 ShowMessage(mem);
Здесь я записываю в дополнительную переменную mem исходную строку, но после выполнения strtok в переменной mem оказывается "0\0123#100", т.е. значение, которое должно быть только в переменной str. И собственно вопросы: почему это происходит и как этого избежать? Каким образом эта функция затрагивает переменную, которая с ней никак не связана? Прямо мистика какая то)
Aleks2215 вне форума Ответить с цитированием
Старый 25.04.2012, 13:50   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Потому что
Код:
mem=str;
и
Код:
ShowMessage(mem);
а парсишь
Код:
temp=strtok(str.c_str(),"#");
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 25.04.2012, 13:53   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Вы слишком хорошо знакомы со строками, видимо. В си строк - это массив char'ов, а массив это почти указатель на первый элемент. Соответственно, строка
Код:
mem=str;
заставляет переменную mem указывать на ту же строку, на которую указывает str.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 25.04.2012, 14:00   #4
Aleks2215
Пользователь
 
Регистрация: 19.09.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Вы слишком хорошо знакомы со строками, видимо. В си строк - это массив char'ов, а массив это почти указатель на первый элемент. Соответственно, строка
Код:
mem=str;
заставляет переменную mem указывать на ту же строку, на которую указывает str.
Да, я обращал внимание что области памяти у этих переменных совпадают, но как этого избежать? как сохранить строку так, чтобы она не была указателем?
Aleks2215 вне форума Ответить с цитированием
Старый 25.04.2012, 14:12   #5
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Код:
// Assignments
    AnsiStringT& __fastcall operator =(const AnsiStringT& rhs) {
      AnsiStringBase::operator =(rhs);
      return *this;
    }

Код:
AnsiStringBase& __fastcall AnsiStringBase::operator=(const AnsiStringBase& src)
  {
#if defined(USE_ASM)
    asm
    {
      mov     edx, [edx]
      call    _System__LStrAsg
    }
#else
    typedef void (__fastcall *LStrAsg_Proc)(AnsiStringBase*, char*);
    (reinterpret_cast<LStrAsg_Proc>(_System__LStrAsg))(this, src.Data);
#endif    
    return *this;
  }
Указывают на один и тот же адрес в памяти. Косяк Борланда. Хотя по идее нужно было бы скопировать область с данными в операторе присваивания.

используй массивы char и будешь счастлив.
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 25.04.2012 в 14:18.
Krok27 вне форума Ответить с цитированием
Старый 25.04.2012, 14:17   #6
Aleks2215
Пользователь
 
Регистрация: 19.09.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Krok27 Посмотреть сообщение
Код:
// Assignments
    AnsiStringT& __fastcall operator =(const AnsiStringT& rhs) {
      AnsiStringBase::operator =(rhs);
      return *this;
    }
Указывают на один и тот же адрес в памяти.
Хм... я немного не понял, откуда этот код? из описания типа AnsiString? и как он мне поможет сохранить свою переменную не как указатель?
Aleks2215 вне форума Ответить с цитированием
Старый 25.04.2012, 14:29   #7
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
Хм... я немного не понял, откуда этот код? из описания типа AnsiString?
Из описания AnsiString.

Цитата:
и как он мне поможет сохранить свою переменную не как указатель?
никак.
сделай как нибудь в лоб типа
Код:
mem = str.SubString(1, str.Length());
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 25.04.2012, 14:30   #8
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Вы не можете сохранить ее не как указатель. Вроде есть функция strcpy или что-то похожее, копирует строку.
Да, и зачем Вам AnsiString? Чем обычные строки не угодили?
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 25.04.2012 в 14:32.
Granus вне форума Ответить с цитированием
Старый 25.04.2012, 14:45   #9
Aleks2215
Пользователь
 
Регистрация: 19.09.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Krok27 Посмотреть сообщение
Из описания AnsiString.


никак.
сделай как нибудь в лоб типа
Код:
mem = str.SubString(1, str.Length());
Я уже и сам в лоб сделал вот так:
Код:
mem=" "+str;
 ShowMessage(Trim(mem));
Но твой вариант тоже работает. Спасибо
Granus, да просто привык с AnsiString в билдере работать, вот и все))
Aleks2215 вне форума Ответить с цитированием
Старый 25.04.2012, 16:30   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Указывают на один и тот же адрес в памяти. Косяк Борланда.
Лучше жевать, чем ...

АнсиСтринг - это планомерная замена обычных чаровских строк, выросла из недр в силу ввода юникода. И да, их поведение было задумано и сделано именно, как поведение обычных чаровских строк.
Ну вот не взялася из небытия РАД ХЕ2 (или как она там)...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
strtok Matr1x Общие вопросы C/C++ 5 18.02.2012 20:34
strtok Lotles Общие вопросы C/C++ 4 21.12.2011 21:04
Использование функции strtok Djost Фриланс 1 27.05.2010 16:21
strtok... Joe_Tribbiani Общие вопросы C/C++ 0 02.05.2010 15:52
си. strtok. RZMTZM Общие вопросы C/C++ 2 05.01.2010 12:59