2012-02-17 2 views
2

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

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

Я хочу получить «Это» «это» «а» «собака» «А» «очень», «хороший» «один» 1 на 1.

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

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

+0

Знаете ли вы все буквы, не так ли? Поэтому, если вы найдете что-то, что не является буквой, считайте его разделителем. –

+0

Возможный дубликат [Как сделать токенизацию строки в C++?] (Http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) –

ответ

2

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

auto it = std::find_if(str.begin(), str.end(), [] (const char element) -> bool { 
         return std::isspace(element) || std::ispunct(element);}) 
3

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

index = str.find_first_not_of (yourDelimiters); 

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

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

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

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

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

+1

Он не знает что будет в качестве разделителя. –

0

Решение 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(), так и быть осторожным.

Удачи :)