Разбить строку на слова С++
Именно какой синтаксический анализатор вам нужен не до конца понятно. Но 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, иначе теряется вся суть задачи - собрать велосипед самому и посмотреть как это работает.