C ++ разделенная строка с символами пробела и пунктуации - PullRequest
2 голосов
/ 17 февраля 2012

Я хочу разбить строку, используя C ++, который содержит пробелы и знаки препинания.

например. str = "This is a dog; A very good one."

Я хочу получить "This" "is" "a" "dog" "A" "очень" "good" "one" 1 на 1.

Это довольно просто, если использовать только один разделитель, используя getline , но я не знаю всех разделителей. Это могут быть любые знаки препинания.

Примечание: я не хочу использовать Boost!

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012

Итак, начиная с первой позиции, вы найдете первый действительный токен.Вы можете использовать

index = str.find_first_not_of (yourDelimiters);

Затем вы должны найти первый разделитель после этого, чтобы вы могли сделать

delimIndex = str.substr (index).find_first_of (yourDelimiters);

, тогда ваше первое слово будет

// since delimIndex will essentially be the length of the word
word = str.substr (index, delimIndex);

Затем вы обрезаете свою строку и повторяете.Вы, конечно, должны обрабатывать все случаи, когда find_first_not_of и find_first_of возвращают npos, что означает, что символ был / не найден, но я думаю, что этого достаточно для начала.

Кстати, я неутверждая, что это лучший метод, но он работает ...

2 голосов
/ 17 февраля 2012

Используйте std::find_if() с лямбдой, чтобы найти разделитель.

auto it = std::find_if(str.begin(), str.end(), [] (const char element) -> bool {
                       return std::isspace(element) || std::ispunct(element);})
0 голосов
/ 17 февраля 2012
Решение

vmpstr работает, но может быть немного утомительным.Несколько месяцев назад я написал библиотеку C, которая делает то, что вы хотите.http://wiki.gosub100.com/doku.php?id=librerias:c:cadenas

Документация написана на испанском языке (извините).

Не требует внешних зависимостей.Попробуйте использовать функцию splitWithChar ().

Пример использования:

#include "string_functions.h"
int main(void){

    char yourString[]= "This is a dog; A very good one.";
    char* elementsArray[8];
    int nElements;
    int i;

    /*------------------------------------------------------------*/
    printf("Character split test:\n");
    printf("Base String: %s\n",yourString);

    nElements = splitWithChar(yourString, ' ', elementsArray);

    printf("Found %d element.\n", nElements);

    for (i=0;i<nElements;i++){
        printf ("Element %d: %s\n", i, elementsArray[i]);
    }

    return 0;
}

Исходная строка "yourString" изменяется после использования spliWithChar (), поэтому будьте осторожны.

Удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...