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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
#1

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

31.08.2012, 04:13. Просмотров 1189. Ответов 20
Метки нет (Все метки)

Подскажите где можно почитать прочитать о том как правильно использовать strtok с максимально простой терминологией и максимально подробно...просто как не печально хорошего и подробного описания я по ней найти не могу...
+И очень извиняюсь можете также объяснить что такое статический указатель...а то эта 1на из часто встречающихся формулировок в описании данной команды логический смысл которой мне увы неясен...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2012, 04:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос работа с памятью strtok (C++):

Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok - C++
Задача Дана строка слов с разделителями, в данном примере слова с пробелами Нужно, используя функцию strtok, сформировать из этих слов...

Работа с strtok (подскажите) - C++
char buffer; strcpy(buffer, "1|2|3|4|5|||8|9|10" ); //если между разделительными символами нет значений ||| // они просто...

Работа с памятью - C++
Нужно ривести пример использования операторов new и delete для выделения памяти под двумерный массив и освобождения памяти двумерного...

Работа с памятью - C++
Всем привет! Не могу разобраться, как написать код программы, которая моделирует механизм виртуальной памяти. Кто сможет реализовать хотя...

работа с памятью - C++
Доброго времени суток! У меня возникло затруднение - нужно реализовать на языке Си программу,демонстрирующую распределение памяти таким...

Работа с памятью - C++
Может кто хорошо понимает механизм выделения и освобождения памяти объяснить его, а то я в конец запутался с ним, вот помогал одному...

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

p.s Ребят, если кто-то из ученых ( ^^ ) читает эту тему, а каким образом вообще строка делится однозначно до NULL? Не уж то в функции массив в static записывается и, если да, то там есть и strlen для подсчет строки, который так же static, чтобы в конце вернуть NULL?
1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
31.08.2012, 19:00 #5
nexen, В реализацию какой-нибудь strtok-а посмотри.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
31.08.2012, 19:26 #6
ForEveR, да вот нет времени сейчас, чтобы зарываться в deep code это, поэтому и подумал, вдруг кто уже знает ; (
0
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
31.08.2012, 23:52  [ТС] #7
огромнейшее спасибо а на примере еше можна обьяснение..... очень стыдно но просто не как не могу логически осмыслить данный процес...
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 00:01 #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;
}
Что тебе тут не понятно, спрашивай.
1
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
01.09.2012, 01:08  [ТС] #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;
}

вот собственно расписал что и насколько я понимаю попроге...
+смотрю наработу программы понимаю что я ошибаюсь вовсех догадках но непонимаю почему....
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
01.09.2012, 01:14 #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;
}
1
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 01:24 #11
алексейч,
8. Объявляем указатель.
9. Выводим строку, которая подлежит "расчленению".
10. Получаем указатель на первый результат ("This").
11. Можно просто while( pch ). Ничего не измениться. В этом ты прав.
13. Выводим результат.
14. Получаем следующий результат до тех пор, пока не закончится строка. (проверка в 11-1 строке)
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
01.09.2012, 01:27 #12
lazybiz,
11. Можно просто while( pch ). Ничего не измениться. В этом ты прав.
Точно-ли? В таком случае цикл эквивалентен while (pch != 0), что если мне не изменяет память, в Си не всегда является эквивалентным while(pch != NULL).
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 01:29 #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Точно-ли?
Точно. 0 и NULL это ложь что в Си, что в С++. NULL это же тот же самый 0, представленный в виде указателя ((void *)0).
1
алексейч
2 / 2 / 0
Регистрация: 22.02.2012
Сообщений: 66
Записей в блоге: 1
01.09.2012, 01:32  [ТС] #14
pch = strtok (NULL, " ,.-");
спасибо...но всеже боюсь неправильно понимаю....тоесть мы обнуляем указатель на данное значение... из за чего по условию выходит следуюшее и т.д..?
блин 3 день мучаюсь..надеюсь поможете сегодня доконца понять данный пример +огромное спс что помогаете...
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 01:35 #15
Цитата Сообщение от алексейч Посмотреть сообщение
тоесть мы обнуляем указатель на данное значение...
Не обнуляем, а присваиваем pch новое значение.
Цитата Сообщение от алексейч Посмотреть сообщение
из за чего по условию выходит следуюшее и т.д..?
Да.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 01:35
Привет! Вот еще темы с ответами:

Работа с памятью в С++ - C++
Здравствуйте. Если я правильно понимаю, то при запуске программы, программе выделяется определенное кол-во памями, которое оно может...

Работа с памятью - C++
Добрый день всем. Я только начал изучение C#(раньше работал c: C++ маленько -т.е. общее представление о нем имею) и у меня вопрос, можно...

Работа с памятью - C++
Есть приложение,в нем есть label'ы. Есть ли какая-нибудь возможность средствами C++ допустим, перевести эти контролы? Если есть - дайте...

Работа с памятью - C++
Форумчане, доброго времени суток. Заранее извиняюсь за нубские вопросы, но должен разобраться в теме. Суть такова: написал class...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
01.09.2012, 01:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru