Как разбить string на массив char

Как разбить string на массив char

БлогNot. C++: как разобрать строку на слова средствами string?

C++: как разобрать строку на слова средствами string?

Во встроенном классе string, в отличие от нативных строк char * , нет такой же удобной функции для разбора на слова, как strtok в классическом C. Свойств вроде DelimitedText, как в VCL, тоже не наблюдается. Меж тем, задача остаётся актуальна, и решить её в простейшем случае можно так (консоль Visual Studio 2010):

Здесь бьётся, в общем, не на слова, а на лексемы, поэтому не исключаются знаки препинания, стоящие последними символами строк vecstr[i] , а также слова, не содержащие ни одного алфавитно-цифрового символа и т.п. Но направление, в котором можно смотреть для решения задачи, пример показывает 🙂

Разумеется, ничто не мешает сделать разбор и более традиционными, чем переопределённый оператор, ведь все методы для проверки и извлечения подстрок в классе string имеются. Например, по аналогии с Паскалем, можно так (по-прежнему дано только базовое разбиение на лексемы, но не анализ отдельных строк):

05.10.2015, 17:44; рейтинг: 10830

Я хочу, чтобы string.split слово в массив символов.

Вышеприведенный код не работает — он возвращает "перенаселенность" как Object..

Как разбить его на массив символов, если исходная строка не содержит запятых и пробелов?

8 ответов

160 Решение lonesomeday [2011-06-26 17:52:00]

Вы можете разбить на пустую строку:

Если вы просто хотите получить доступ к строке в виде массива, вы можете сделать это без split :

Вы также можете получить доступ к каждому символу с его индексом, используя синтаксис обычного массива. Обратите внимание, однако, что строки неизменяемы, что означает, что вы не можете установить значение символа с помощью этого метода и что он не поддерживается IE7 (если это все еще имеет значение для вас).

Читайте также:  Как удалить драйвер xbox 360 controller

Старый вопрос, но я должен предупредить:

Как уже отмечалось, если ваша цель — обращаться к символам с помощью index , вы можете использовать str[index] (ES5) или str.charAt(index) и не нуждаться в преобразовании.

РЕДАКТИРОВАТЬ: Если вам все равно, str[index] (ES5) и str.charAt(index) также вернут странные результаты с кодировками без BMP. например ‘😎’.charAt(0) возвращает "�" .

Вы получите странные результаты с наборами не BMP (не-Basic-Multilingual-Plane).

Причина в том, что методы, подобные .split() и .charCodeAt() , относятся только к символам с кодовой точкой ниже 65536; клюв. более высокие кодовые точки представлены парой псевдонимов surrogate .

Используйте возможности ES2015 (ES6), где это возможно:

Используя оператор spread:

Или split с новым флагом u RegExp:

Для ES5 параметры ограничены:

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

Для этого требуется knownCharCodeAt() функция и для некоторых браузеров; a String.fromCodePoint() polyfill.

UPDATE: прочитайте эту хорошую статью о JS и unicode.

18 pimvdb [2011-06-26 17:52:00]

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

Метод split() в javascript принимает два параметра: разделитель и предел. Сепаратор задает символ, используемый для разделения строки. Если вы не указываете разделитель, вся строка возвращается, не разделяется. Но если вы укажете пустую строку как разделитель, строка будет разделена между каждым символом.

будет иметь эффект, который вы ищете.

Строка в Javascript уже является символьным массивом.

Вы можете просто получить доступ к любому символу в массиве, как и любой другой массив.

UPDATE

Как указано в комментариях ниже, вышеупомянутый метод доступа к символу в строке является частью ECMAScript 5, который некоторые браузеры могут не соответствовать.

Читайте также:  Не грузится мак ос

Альтернативным методом, который вы можете использовать, является charAt(index) .

4 Gumbo [2011-06-26 17:51:00]

Вы можете использовать регулярное выражение /(?!$)/ :

Отрицательное утверждение вперед (?!$) будет соответствовать прямо перед каждым символом.

.split(») разделил бы emojis пополам.

Onur-решения и регулярное выражение предлагают работу для некоторых emojis, но не могут обрабатывать более сложные языки или комбинированные эмоции. Считайте, что этот эмози разрушен:

Также рассмотрим этот текст хинди "अनुच्छेद", который разбивается следующим образом:

но на самом деле он должен быть разбит следующим образом:

потому что некоторые из символов объединяют метки (думаю, диакритики/акценты на европейских языках).

Для этого вы можете использовать библиотеку графт-разделителей:

Это правильное стандартное письмо, расщепленное во всех сотнях экзотических кромок — да, их много.

Я пытаюсь преобразовать строку, например, «как дела?» в массив без пробелов и знаков препинания, например <‘h’, ‘o’, ‘w’, ‘a’, ‘r’, ‘e’, ​​’y’, ‘o’, ‘u’ , ‘d’, ‘о’, ‘я’, ‘N’, ‘G’>
Это функция, которую я написал ниже, но она не работает.

Решение

Сначала несколько замечаний по вашему коду:

(Т.е. ) бесполезен, так как вы ничего не используете из Заголовок в вашем коде.

поскольку string входной параметр только для чтения, вы можете передать его const & ,

Поскольку вам нужен массив символов, вы можете либо вернуть vector (или даже string …).

Чтобы решить вашу проблему, вы можете просто перебирать символы входной строки, и, если они являются алфавитными и числовыми символами (то есть без пробелов, без запятой и т. Д.), Вы можете добавить их в вектор выходных результатов символов.

Вы можете рассмотреть следующий пример закомментированного кода:

Если вам нравится больше «Функциональный» стиль, вы можете использовать std::copy_if() алгоритм, с некоторым кодом, как это:

Читайте также:  Почему телефон нагревается при работе в интернете

Другие решения

Вы изобретаете колесо

Вы также можете использовать простую итерацию, используя char* пройти через строку и выбрать то, что вам нужно.

Я не уверен, что является причиной возвращения array[80] FRM split но это не имеет отношения к вашему вопросу.

Еще одно простое решение:

Я изменяю тип возвращаемого значения на строку, если вы настаиваете, вы можете взять c_str() возвращаемого значения в const char*

Ссылка на основную публикацию
Как проверить блок питания мультиметром 12v
Вначале статьи сразу сделаю оговорку. Статья не для профи, а для начинающих мастеров-компьютерщиков и для тех, кто самостоятельно хочет найти...
Как подключить камеру заднего вида к зеркалу
Всем привет! Нужен совет, чтоб было практично, эстетично и все такое.В общем суть такая: заказал я в китае зеркало-регистратор с...
Как подключить колонки к компу виндовс 7
Всем привет уважаемые гости! Как любое сложное электронное устройство, современный ПК требует настройки, даже если вы устанавливаете операционную систему с...
Как проверить включен ли микрофон на ноутбуке
В каждом ноутбуке имеется встроенный микрофон для записи звука. Он же применяется при общении в скайпе, онлайн играх и т.д....
Adblock detector