Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
6 / 9 / 0
Регистрация: 19.10.2019
Сообщений: 194

Функция strtok

09.05.2022, 14:42. Показов 1459. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Возникло непонимание работы данной функции.

C
1
2
3
4
5
6
7
8
9
10
    char str2[]="hello,world ich";
    char *ptr4=strtok(str2," ,");
    char *ptr5=strtok(NULL," ,");
    char *ptr6=strtok(str2," ,");
    char *ptr7=strtok(NULL," ,");
 
    printf("ptr4 %p content %s\n", ptr4, ptr4);
    printf("ptr5 %p content %s\n", ptr5, ptr5);
    printf("ptr6 %p content %s\n", ptr6, ptr6);
    printf("ptr7 %p content %s\n", ptr7, ptr7);
Вывод:
ptr4 0061FEE8 content hello
ptr5 0061FEEE content world
ptr6 0061FEE8 content hello
ptr7 00000000 content (null)

Вопрос - почему так получается? В первом случае ptr4 и ptr5 выдают значения, во втором ptr6 выдает значение, а уже в ptr7 нет. Как можно посмотреть изменения в памяти?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.05.2022, 14:42
Ответы с готовыми решениями:

Написать свою strtok
Помогите пожалуйста, нужно написать свою функцию, чтоб работала как strtok только в качестве второго параметра передавалась не константа, а...

Функции strtok и toupper
Доброго времени. Задача - ввести координату, например: 23.25N, 62,36W. В качестве разделителя между символами широты/долготы может быть...

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

5
Windows must die
673 / 855 / 103
Регистрация: 23.11.2021
Сообщений: 5,073
Записей в блоге: 18
09.05.2022, 14:56
А не судьба прочесть man strtok? Там даже пример есть с последовательным вызовом двух функций на одной и той же строке!
Нельзя так с strtok издеваться: если нужно вызывать повторно, то следует использовать strtok_r.
0
6 / 9 / 0
Регистрация: 19.10.2019
Сообщений: 194
09.05.2022, 17:10  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А не судьба прочесть man strtok?
Да в том то и дело, что не совсем достаточно этого(Для общего понимания да). Для того и сказали поиздеваться над strtok только и разобрать что происходит на "темной стороне луны" и почему. Вот и спросил тут, может кто-то разбирается хорошо дабы не гуглить неделю.
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,387
09.05.2022, 18:27
Тут не надо гуглить, а надо прочитать "man strtok" и делать, как там написано. У меня с ней никогда трудностей не было.
Но всё же я написал свою подпрограмму, которая разбирает сразу всю строку и возвращает результат
в int-масиве с парами (смещение, длина) и строку не портит. Мне так оказалось удобнее.
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
09.05.2022, 18:48
Цитата Сообщение от StalinStr Посмотреть сообщение
Добрый день. Возникло непонимание работы данной функции.
Обратите внимание что эта функция необратимо разрушает строку первого параметра.
То же самое относится к strtok_r(). Для библиотечных функций можно полагаться на тип параметров - если параметр "char*" вместо "const char*", это неспроста.

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 str2[]="hello,world ich";
    char *ptr4=strtok(str2," ,");
    char *ptr5=strtok(NULL," ,");
    char *ptr6=strtok(str2," ,");
    char *ptr7=strtok(NULL," ,");
 
    printf("ptr4 %p content %s original %s\n", ptr4, ptr4, str2);
    printf("ptr5 %p content %s original %s\n", ptr5, ptr5, str2);
    printf("ptr6 %p content %s original %s\n", ptr6, ptr6, str2);
    printf("ptr7 %p content %s original %s\n", ptr7, ptr7, str2);
}
0
Windows must die
673 / 855 / 103
Регистрация: 23.11.2021
Сообщений: 5,073
Записей в блоге: 18
09.05.2022, 19:15
Цитата Сообщение от StalinStr Посмотреть сообщение
разобрать что происходит на "темной стороне луны"
Все элементарно: найденные символы strtok заменяет на нуль (то бишь конец строки). Свой внутренний указатель переставляет на следующий после этого символ, а выдает предыдущее начало строки - вот пользователь и получает как бы полноценную строку.
Однако, если вызвать с этой же строкой strtok второй раз, ничего не выйдет: т.к. строка уже "испорчена" и искомых символов не содержит. Это в манах написано.

Да, я наврал: strtok_r тоже "портит" оригинальную строку. Поэтому если нужно будет повторить, необходимо исходную строку сохранить при помощи strdup.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2022, 19:15
Помогаю со студенческими работами здесь

функция strtok()
Объясните, пожалуйста, функцию strtok()...то что непонятно - заккоментила ps=strtok(str, &quot; &quot;); // понятно, что strtok ()...

Функция strtok
Пытаюсь решить задачу из Дейтела, подсчитать количество вхождений каждого слова в предложение, допустим &quot;to be or no to be&quot;,...

Функция strtok()
Доброе время суток! Подскажите пожалуйста в чем проблема и как с ней бороться. Имеем такой код: #include &lt;iostream&gt; ...

strtok - небезопасная функция
Здравствуйте, VS2019 выдает предупреждение, что strtok - небезопасная функция. Я так понимаю - это из за того, что типа strtok -...

Как работает функция strtok
Как работает функция strtok. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;conio.h&gt; using namespace...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru