Как разбить строку на слова с
Перейти к содержимому

Как разбить строку на слова с

  • автор:

Разбить строку на слова С++

Именно какой синтаксический анализатор вам нужен не до конца понятно. Но std::istream::operator>> и так считывает до символа разделителя, поэтому std::getline не нужна. Если хотите убрать конечные запятые, то:

while (ss >> tmp)

Если хотите разделять tmp по какому то символу(например, если запятые есть в любом месте слова), тогда тут можно использовать один из многочисленных вариантов. Чисто для демонстрации с применением std::getline можно использовать не самый удачный вариант:

while (ss >> tmp) < std::istringstream s(tmp); bool valid = true; while (std::getline(s, tmp, ',')) < valid = false; words.push_back(tmp); >if (valid) < if (tmp.back() == ',') tmp.pop_back(); words.push_back(tmp); >> 

Если вам нужно обработать строку, то используйте методы класса _ это самый эффективный способ. Для разбиения строки по нескольким разделителям, используйте std::string::find_first_of . Как это сделать? В сайте бывали такие вопросы, так что на них уже отвечали. Поищите, покопайтесь и найдете, а лучше пытайтесь решать самостоятельно.

Разбить строку на отдельные слова списком

Как это можно грамотно реализовать? Нужно ли, например, сразу в условный буфер прочитать строку и работать с ней? Или посимвольно читать и через свитчи обрабатывать? Разделитель пробел или табуляция. Кодом ответ не нужен, хотя бы с чего начать. Далее разделение будет включать ещё и учитывание пробелов в составе слова и т.д. То есть с помощью спец символов можно будет записать в одно звено списка что-то вроде «asd fg». Но сейчас мне требуется грамотное начало для разбиения строки просто на слова. Желательно без использования string.h и точно никакого ++ кода.

Отслеживать
задан 13 авг 2022 в 22:10
383 1 1 серебряный знак 10 10 бронзовых знаков

Это учебная задача. Пожалуйста, добавьте в вопрос ваш код, решающий задачу. Без этого мы не продвинемся.

13 авг 2022 в 23:01

Можно считать всю строку, можно посимвольно. Можно и через свитчи 🙂 Можно (но я так понял, запрещено преподавателем) через strtok . С чего начать? С написания какого-то из вариантов. Это не та задача, в которой вы можете затратить неделю работы, чтобы потом понять, что пошли не тем путем. Просто начинайте реализовывать какой-то из вариантов, а дальше работа сама покажет.

14 авг 2022 в 5:02

@Harry, это будет в итоге командный интерпретатор, задача просто разделена на много частей, это начало 😀 так что возможно неделю все таки займёт)

14 авг 2022 в 8:37

@StanislavVolodarskiy, код начальный ни к чему, варианты которые вижу я описал, просто не совсем понимаю какой выбирать для дальнейшего расширения ))

Разбить строку на массив символов в C ++

Я пишу программу, которая требует ввода строки, а затем разбивается на отдельные буквы. По сути, мне нужна помощь в поиске способа превратить «строку» в [ «s», «t», «r», «i», «n», «g» ]. Строки также сохраняются с использованием строкового типа данных, а не только массива символов по умолчанию. Я хотел бы сохранить его таким образом и избежать char, но при необходимости использовать его. Любая помощь будет приятной, спасибо заранее.

Galileo 29 янв. 2010, в 01:09
Поделиться

Нужно ли что-то делать с буквами после их разделения? То есть вам нужно поместить буквы в какую-то структуру данных, отличную от string ?

Potatoswatter 29 янв. 2010, в 00:15
Это глупый вопрос, строка — это массив символов.
Ian 20 янв. 2012, в 21:40
Поделиться:

4 ответа

Лучший ответ

string a = "hello"; cout  

Я надеюсь, что это объяснит

Luca Matteis 29 янв. 2010, в 01:06
Поделиться
Мне не хочется, потому что я здесь не для того, чтобы давать уроки, просто отвечаю.
Luca Matteis 29 янв. 2010, в 09:18
Для записи, вы также можете просто сделать: cout << "hello" [1]; AshleysBrain 29 янв. 2010, в 10:30 @AshleysBrain: Или cout << 1 ["привет"]; ybungalobill 05 дек. 2010, в 10:35 Показать ещё 1 комментарий

Предполагая, что у вас уже введена строка:

string s("string"); vector v(s.begin(), s.end()); 

Это заполнит вектор v символами из строки.

Ryan 29 янв. 2010, в 00:50
Поделиться
Лучшее решение, которое я видел! Большое спасибо.
Fomentia 01 окт. 2015, в 17:25

Попробуйте использовать метод c_str() std::string :

#include using namespace std; int main(void) < string text = "hello"; size_t length = text.length() + sizeof('\0'); char * letters = new char[length]; strcpy(letters, length.c_str()); for (unsigned int i = 0; i < length; ++i) < cout return EXIT_SUCCESS; > 

Thomas Matthews 29 янв. 2010, в 02:05
Поделиться

Добавление sizeof ('\ 0') к length не требуется, поскольку оно может быть больше 1, и тогда выделенный массив будет иметь больший размер, чем необходимо. Лучше добавлять 1 вместо sizeof ('\ 0').

George 29 янв. 2010, в 01:09
Джордж, sizeof (char) всегда равен 1.
paxdiablo 29 янв. 2010, в 01:24

Не правда! sizeof (char) не всегда 1. Я работал с DSP-чипом, где все было по крайней мере 32-битным, char, short, int - sizeof (char) == sizeof (short) == sizeof (int). Стандарт C просто говорит, что sizeof (char)
Ryan 29 янв. 2010, в 04:17

Нет, @Ryan, извини, но ты ошибаешься. В разделе 5.3.3 «Sizeof» указано: «sizeof (char), sizeof (char со знаком) и sizeof (char без знака) равны 1». Символ - это байт, но ни один из них не обязательно является октетом (8 бит). Это то же самое, что и с C. Это из черновика n3000 C ++ 0x, но так было всегда.

paxdiablo 29 янв. 2010, в 09:31

Ах, я исправлюсь. Моя настоящая точка зрения была в том, что не принимайте 1 == 8 битов, которые вы четко заявили. Интересная вещь о чипе DSP была 1 == sizeof (char) == sizeof (short) == sizeof (int), что удивило меня, когда я обнаружил, что 1 == 32 бита.

Ryan 29 янв. 2010, в 16:13

Да, Райан, это действительно укусило меня однажды. Я подумал, что нашел несоответствие в стандарте ISO C, так как они говорили о том, что символ может быть больше 8 бит, но sizeof возвращает количество байтов (но все равно один для символа). Оказывается, в ISO также был переопределен байт (что имеет смысл, во всех других стандартах, например в своих, используются 8-битные октеты).

paxdiablo 30 янв. 2010, в 03:39
Показать ещё 4 комментария

Строка - это просто последовательность базового символа (т.е. char для std::string и wchar_t для std:: wstring).

Из-за этого вы легко получаете каждую букву:

for (std::string::size_type l = 0; l

R Samuel Klatchko 29 янв. 2010, в 00:31
Поделиться

Ты :: собирается :: напугал :: ему :: с :: всех :: что :: вещи. imo с использованием int или, что еще лучше, size_t будет работать на любой существующей платформе, и это намного понятнее.

Thomas Bonini 29 янв. 2010, в 00:08

Ещё вопросы

  • 0 показывая загрузочный образ php
  • 1 Как применить scipy.stats.describe к каждой группе?
  • 0 Работа с несколькими состояниями и одним контроллером в angular.ui-router
  • 0 UI Bootstrap Typeahead игнорирует выбранное значение
  • 0 Использование авто-ключевого слова и полагаться на ввод типа компилятора
  • 0 hasClass не работает
  • 0 Codeigniter Pagination начинается с другой страницы и другой активной ссылки для разных сотрудников, в то время как код один и тот же
  • 0 Необработанное исключение, не похоже, что что-то не так
  • 0 Javascript скрипты замедляются до нуля
  • 1 Как отловить ошибку HTTP по java.net.URL
  • 0 AngularJS / Javascript присвоение ключа к переменному синтаксису
  • 1 Как я могу написать Java-код на стороне сервера для возврата любого вида файла в виде потока, используя JAX-RS (Джерси)?
  • 0 Как удалить maridb и установить remysql в Centos 7, Linux?
  • 1 Проверьте конкретный текстовый шаблон пароля, содержащийся в имени пользователя для проверки формы JavaScript
  • 0 Проверка регулярных выражений для смешанных дробей - Visual C ++ 2012
  • 0 Значения длинных URL не отправляются в Code Igniter
  • 1 как 32-битный процессор обрабатывает 64-битное двойное значение?
  • 1 Преобразование имен столбцов в числа?
  • 0 Динамическая форма не работает в таблице
  • 0 Изменение ориентации вызывает изменение размера шрифта
  • 0 показать загруженное изображение, прежде чем нажать на кнопку отправить
  • 1 Как разбить число на строки цифр?
  • 0 проблема в кнопке выхода FB
  • 0 Маршрутизация пользовательского интерфейса с корневым состоянием не разрешается до дочернего контроллера состояния
  • 0 Два элемента div должны оставаться в одном ряду
  • 0 C ++, используя операторы if-else для вычисления sin и cos
  • 0 Код отслеживания не установлен (Google Analytics)
  • 0 проблема при передаче аргумента из директивы в контроллер
  • 0 Dygraphs: Свернуть / скрыть часть диапазона дат по оси X
  • 1 Почему нельзя создать экземпляр локального класса в Java?
  • 1 C # Создание чатов с несколькими клиент-серверными сокетами
  • 0 Расширяемое меню HTML
  • 1 Можно ли иметь несколько строк в одной позиции массива?
  • 0 Как обновить набор указателей с ++?
  • 1 java.lang.NullPointerException: попытка чтения из поля 'android.view.View android.support.v7.widget.RecyclerView $ ViewHolder.itemView'
  • 1 Модульная экспонента в Java (алгоритм дает неправильный ответ)
  • 0 Счетчик кликов в Javascript
  • 0 Могу ли я решить систему линейных уравнений в форме xA = b, используя Eigen, с A, разреженным?
  • 0 HTML данные таблицы в JSON и отправить его контроллер Mvc в список
  • 0 Knex MySQL Migration «Ошибка необработанного отклонения: запрос транзакции уже выполнен»
  • 1 Невозможно создать экземпляр класса в 2 разных проектах библиотеки классов
  • 0 Сущность / строка обновляется только иногда с помощью Spring / Hibernate?
  • 0 Получение данных при печати URL в html-странице
  • 1 double.ToString («G»), но всегда включать точку?
  • 0 Angular Template Cache - Очистить кэш для обновленного шаблона
  • 0 Почему я получаю сообщение об ошибке для последней строки кода?
  • 0 Ошибка 404 на REST Easy
  • 1 WPF Treeview печатает свойство строкового типа и рассматривает каждую букву как элемент
  • 1 Копировать весь текстовый документ, включая таблицы, в другой, используя Python
  • 0 JQuery код функции each () выполняется, даже если в коллекции нет элементов

Разбить строку по словам

UPD. Ещё вопрос. Как можно перевернуть строку задом-наперёд?

Пример Дано: qwerty Получаем: ytrewq

Отслеживать

Алексей Кофанов

задан 21 дек 2013 в 2:09

Алексей Кофанов Алексей Кофанов

25 2 2 серебряных знака 6 6 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

#include #include #include int _tmain(int argc, _TCHAR* argv[]) < std::string line = "a line of text to iterate through"; std::string word; std::istringstream iss(line, std::istringstream::in); std::vectorwordsVector; while( iss >> word ) < wordsVector.push_back(word); >std::reverse(begin(wordsVector), end(wordsVector)); return 0; > 

Отслеживать

ответ дан 21 дек 2013 в 3:57

1,918 2 2 золотых знака 18 18 серебряных знаков 37 37 бронзовых знаков

Я думаю, что в таких работах не разрешают использовать стандартные библиотеки, такие как vector и algorithm, иначе теряется вся суть задачи - собрать велосипед самому и посмотреть как это работает.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *