C++ для начинающих. Строки. Разбить строку на слова

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

Начинающим программистам полезно поупражняться в решении задачи разбиения предложения на слова. Хорошим будет упражнение решения этой задачи в лоб, т.е. написанием своей собственной функции. Но умение решения в лоб не значит, что потом задачу требуется решать именно таким образом. В C++ много полезных функций, которые использовать безопаснее и лучше чем использовать самописные велосипеды. Об одной из таких функций здесь речь и пойдет. В C++ описана встроенная функция, которая позволяет разбить предложение на слова.

  • strtok

Вопрос, который должен возникнуть: «Что происходит? и почему так работает. Зачем здесь это и зачем то»

  • Функция strtok изменяет строку, путем изменения символа-разделителя на признак окончания строки, таким образом при первом вызове функции вы получаете первое слово.

Убедиться в этом не сложно

Так как строка изменилась, то вопрос в том как вычислить следующее слово за первым. Вот эту задачу берет на себя функция strtok, которая разбивает исходную строку на так называемые «токены». Указатель на начало каждого из этих «токенов» указывает на начало слова. Чтобы выполнить переход между указателями на каждый из этих непонятных «токенов», выполняется цикл

Так как функция изменяет исходную строку, то каждый новый вызов функции возвращает новый «токен» или проще говоря — указатель на следующее слово из строки. Таким образом каждая итерация цикла помогает обрабатывать отдельные слова исходной строки.

Иногда нужно не навредить анализируемую строку, в этом случае можно использовать функции, внутри которых будет создаваться локальная копия строки либо самому описывать резервную копию и после анализа и выполнения необходимых операций возвращать исходную строку из созданной копии.

  • Лексема (token) — Это последовательность символов, выражающих нечто, что является отдельной единицей. В случае со строкой и функцией strtok — токен есть слово., а вообще токен это, например отдельное значение массива, или же отдельный оператор исходного кода или что-то еще такое, что является отдельной единицей какого-либо множества.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

11 комментариев: C++ для начинающих. Строки. Разбить строку на слова

  • Sergio говорит:

    А как разбить строку на слова и записать каждое полученное слово в отдельную переменную?
    Покажите, пожалуйста, хотя бы на примере 2х слов.

    • admin говорит:

      я могу показать простой пример, если известно сколько в предложении слов. Т.е. известно сколько переменных нужно объявить в программе.
      И этот подход в любом случае идеологически неправильный.

      подойдет такой пример?
      =====================
      немного подрихтуете. пример основан на примере из темы, но в другой среде разработки.

      Если вы под отдельными переменными имели ввиду элементы массива, то извиняйте. Как был задан вопрос, так я и ответил.

    • admin говорит:

      Если в предложение неизвестное количество слов и оно может быть разным, то для того, чтобы описывать каждое слово в отдельной переменной, нужно каждую переменную создавать во время выполнения программы. Это работа с указателями и выделением памяти. Но все равно все сводится к тому, что после работы программы надо будет очищать выделенную память своими руками, а чтобы ее очищать, нужно где-то хранить адреса. Объяснять долго. Всё сведется к тому что нужен массив, в котором будут храниться занятые системой адреса для их освобождения после завершения работы программы. Это геморрно, неудобно и неэффективно. Или же надо лезти в деревья (стеки, деревья, очереди 🙂 )

  • валя говорит:

    здравствуйте! я е знаю кому задать вопрос я хочу ищучить си++ и тут наткнулась на пример
    http://codeserfer.com/3615-primer-raboty-s-klassami-i-nasledovaniem.html
    как в этом разобраться???? Препод на курсах задала разобраться с инкапсуляцией, а я много проспустил а и вообще ничего не понимаю в ооп… помогите пожалуйста

    • admin говорит:

      здравствуйте. я быстро не могу помочь никак, да и непонятно зачем пропускали если хотите изучить С++
      ваш пример — перегрузка операторов. Перегрузка операторов почти ничего не объясняет в икнапсуляции.

    • admin говорит:

      Инкапсуляция

      Инкапсуляция
      Как понимать классы в С++ http://ci-plus-plus-snachala.ru/?p=35
      Немного о private http://ci-plus-plus-snachala.ru/?p=44
      Еще немного о private http://ci-plus-plus-snachala.ru/?p=44
      Инкапсуляция — это то, что к private относится (я бы назвал ее приватизацией, т.к. под слово хорошо подходит и произношением и смыслом, но злые технари не любят когда вещи называют не теми именами, которые им даны)

  • Nazar говорит:

    Здравствуйте! Не могли бы вы мне помочь? Как разбить файл(.txt) на части по указанным строкам и записать эти части на отдельные файлы. Помогите пожалуйста…..

  • Nazar говорит:

    на с++

  • Guardian говорит:

    Извините, а причём тут С++? Ваш пример — дикая смесь двух языков. Из всего С++ здесь только std::cout всё остальное — С. Почему не используются строковые потоки, кода было бы раз в 5 меньше.

    Уважаемые новички! Помните, что если вы компилите .cpp, это ещё не значит, что вы пишете на С++. Если вы не знаете стандартной библиотеки, вы не знаете С++. Если вы не используете виртуальные функции, вы даже не приступили к ООП. Вы используете мощнейший язык на полпроцента.

    • admin говорит:

      На занятиях часто ограничивают задания делать без STL и что, это значит учат уже не С++?
      Не зная STL не знаешь С++ — дикая чушь. STL не есть С++, С++ способно жить и без STL
      C++ — это не ООП язык, а мультипарадигменный язык, он поддерживает ООП и только.
      Ну и что, что пример смешан? C++ задумывался как язык, который включает в себя Си.

  • Hazatdum говорит:

    Здравствуйте, очень интересная статья!
    А можно ли как-нибудь записать еще и сами разделители отдельно? Например есть строка «А=В+С» и вывод был бы
    А
    =
    В
    +
    С

    Помогите, пожалуйста!

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     
Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Работа программиста и шамана имеет много общего - оба бормочут непонятные слова, совершают непонятные действия, и не могут объяснить, как оно работает

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок