Форум программистов, компьютерный форум CyberForum.ru

работа с памятью strtok - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
31.08.2012, 04:13     работа с памятью strtok #1
Подскажите где можно почитать прочитать о том как правильно использовать strtok с максимально простой терминологией и максимально подробно...просто как не печально хорошего и подробного описания я по ней найти не могу...
+И очень извиняюсь можете также объяснить что такое статический указатель...а то эта 1на из часто встречающихся формулировок в описании данной команды логический смысл которой мне увы неясен...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2012, 04:13     работа с памятью strtok
Посмотрите здесь:

Работа с strtok (подскажите) C++
Работа с памятью C++
Работа с памятью C++
C++ Работа с памятью
C++ Работа с памятью
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
31.08.2012, 06:18     работа с памятью strtok #2
По мне так всё понятно :
http://www.cplusplus.com/reference/c...string/strtok/
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
31.08.2012, 16:41  [ТС]     работа с памятью strtok #3
Цитата Сообщение от nexen Посмотреть сообщение
По мне так всё понятно :
http://www.cplusplus.com/reference/c...string/strtok/
Ну да...=) понятно =) есле знаеш английский а я увы его ток начал изучать...
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
31.08.2012, 18:33     работа с памятью strtok #4
Вызывая её в первый раз, ты должен передать ей первым параметром - строку текста, а вторым строку разделителей, которыми будет дробиться текст. Функция вернет указатель на первый символ первого слова. Ты его выводишь и вызываешь снова эту же функцию, но в качестве первого параметра указываешь NULL, что говорит функции о том, что мы "гуляем" по той же строке текста, а значит она вернет теперь второе слово и так далее. Если вдруг она вернула NULL (нужна проверка), то дробление закончилось (больше нет слов, которые бы дробились разделителями).
Как там написано : "функция ишет первый символ, не являющийся разделителем и начинает токен с него" - по русски это значит, что в строке должен быть (я не уверен, надо проверить, но у меня нет возможности) хотя бы один символ, отличный от разделителя, указанного (в строке) тобой.
Надеюсь, что теперь ясно. Постарался как можно проще объяснить.

p.s Ребят, если кто-то из ученых ( ^^ ) читает эту тему, а каким образом вообще строка делится однозначно до NULL? Не уж то в функции массив в static записывается и, если да, то там есть и strlen для подсчет строки, который так же static, чтобы в конце вернуть NULL?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.08.2012, 19:00     работа с памятью strtok #5
nexen, В реализацию какой-нибудь strtok-а посмотри.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
31.08.2012, 19:26     работа с памятью strtok #6
ForEveR, да вот нет времени сейчас, чтобы зарываться в deep code это, поэтому и подумал, вдруг кто уже знает ; (
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
31.08.2012, 23:52  [ТС]     работа с памятью strtok #7
огромнейшее спасибо а на примере еше можна обьяснение..... очень стыдно но просто не как не могу логически осмыслить данный процес...
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 00:01     работа с памятью strtok #8
Так тебе же давали пример: http://www.cplusplus.com/reference/c...string/strtok/

пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}
Что тебе тут не понятно, спрашивай.
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
01.09.2012, 01:08  [ТС]     работа с памятью strtok #9
Цитата Сообщение от lazybiz Посмотреть сообщение
Так тебе же давали пример: http://www.cplusplus.com/reference/c...string/strtok/
пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
int main ()
{
  char str[] ="- This, a sample string.";- тут мы создаем массив...(выделяем память под массив)
  char * pch;-создаем указатель...верно?
  printf ("Splitting string \"%s\" into tokens:\n",str);-вывод  массива...
  pch = strtok (str," ,.-");- мы приписываем указатель символам находяшимся между .- или пробелом верно?
  while (pch != NULL) ...условие выполнения есле указатель не равен нулю...вопрос а есле напишем просто while(pch) что изменица(возможно я шас сказал большую глупость но увы я новичек в си...)
  {
    printf ("%s\n",pch);//выводим тот текст  что унас в итоге получился...верно?
    pch = strtok (NULL, " ,.-"); увы непонимаю..
  }
  return 0;
}

вот собственно расписал что и насколько я понимаю попроге...
+смотрю наработу программы понимаю что я ошибаюсь вовсех догадках но непонимаю почему....
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 01:14     работа с памятью strtok #10
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
int main ()
{
  char str[] ="- This, a sample string."; // создаем массив.
  char * pch = NULL; // объявляем указатель, инициализируем NULL-ом
  printf ("Splitting string \"%s\" into tokens:\n",str);//вывод  массива...
  pch = strtok (str," ,.-");// указатель будет указывает на первое значению, вернувшееся из strtok.
  while (pch != NULL) // до тех пор пока указатель не NULL (strok вернет NULL, если больше нечего парсить).
  {
    printf ("%s\n",pch); // выводим то, что вернуло strtok.
    pch = strtok (NULL, " ,.-"); // указатель будет указывать на следующее значение, вернувшееся из strtok. особенность работы strtok: после первого вызова, вместо строки передается NULL.
  }
  return 0;
}
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 01:24     работа с памятью strtok #11
алексейч,
8. Объявляем указатель.
9. Выводим строку, которая подлежит "расчленению".
10. Получаем указатель на первый результат ("This").
11. Можно просто while( pch ). Ничего не измениться. В этом ты прав.
13. Выводим результат.
14. Получаем следующий результат до тех пор, пока не закончится строка. (проверка в 11-1 строке)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 01:27     работа с памятью strtok #12
lazybiz,
11. Можно просто while( pch ). Ничего не измениться. В этом ты прав.
Точно-ли? В таком случае цикл эквивалентен while (pch != 0), что если мне не изменяет память, в Си не всегда является эквивалентным while(pch != NULL).
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 01:29     работа с памятью strtok #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Точно-ли?
Точно. 0 и NULL это ложь что в Си, что в С++. NULL это же тот же самый 0, представленный в виде указателя ((void *)0).
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
01.09.2012, 01:32  [ТС]     работа с памятью strtok #14
pch = strtok (NULL, " ,.-");
спасибо...но всеже боюсь неправильно понимаю....тоесть мы обнуляем указатель на данное значение... из за чего по условию выходит следуюшее и т.д..?
блин 3 день мучаюсь..надеюсь поможете сегодня доконца понять данный пример +огромное спс что помогаете...
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 01:35     работа с памятью strtok #15
Цитата Сообщение от алексейч Посмотреть сообщение
тоесть мы обнуляем указатель на данное значение...
Не обнуляем, а присваиваем pch новое значение.
Цитата Сообщение от алексейч Посмотреть сообщение
из за чего по условию выходит следуюшее и т.д..?
Да.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 01:35     работа с памятью strtok #16
алексейч, Мы не обнуляем указатель. Просто strtok работает именно так, в первый вызов туда посылается строка, которую мы хотим распарсить, в последующие туда посылается NULL.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 01:41     работа с памятью strtok #17
Цитата Сообщение от ForEveR Посмотреть сообщение
... в первый вызов туда посылается строка, которую мы хотим распарсить, в последующие туда посылается NULL.
... до тех пор, пока нам не понадобится распарсить новую строку, в этом случае мы её укажем в качестве первого параметра.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 01:42     работа с памятью strtok #18
lazybiz, Ну да. Не стал это упоминать.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 01:44     работа с памятью strtok #19
пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>
 
int main ()
{
  char str[] ="- This, a sample string.";
  char str2[] ="Съешь еще этих булок.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  
  pch = strtok (str2," .");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " .");
  }
  return 0;
}

результат
Splitting string "- This, a sample string." into tokens:
This
a
sample
string
Съешь
еще
этих
булок
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 01:49     работа с памятью strtok
Еще ссылки по теме:

C++ Работа с памятью в С++
C++ Работа с памятью
Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
01.09.2012, 01:49  [ТС]     работа с памятью strtok #20
Цитата Сообщение от lazybiz Посмотреть сообщение
Не обнуляем, а присваиваем pch новое значение.
блин... меня смушает как сие просиходит...возможно я неправильно понимаю слово указатель... указатель это ссылка на адрес нашей перменной-строки.. или стрток делает какбы массив указателей тоесть наш указатель каждому слову придает свой номер и вот так мы их попарядку выводим....?
Yandex
Объявления
01.09.2012, 01:49     работа с памятью strtok
Ответ Создать тему
Опции темы

Текущее время: 19:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru