2013-09-15 3 views
1

Вопрос в том, как разбить строку на C++? Например, у меня есть `как разбить строку C++, чтобы получить целую строку по отдельности и некоторые ее части/символы

string str = "[ (a*b) + {(c-d)/f} ]" 
  1. Это нужно, чтобы получить целое выражение в индивидуальном порядке, как [, (, а, *, б, ......
  2. И я хочу, чтобы получить скобки только как [, (,), {(,)},] на их правильном положении

Как я могу сделать это с некоторыми легкими способами

+0

Возможный дубликат [Разделение строки на C++] (http: // stackoverflow .com/questions/236129/splitting-a-string-in-c) – paulsm4

+0

Я сомневаюсь, что есть способ, которым вы можете «оба сразу» (кроме написания собственного анализатора, который делает o ne вещь для каждого toke, и что-то еще для скобок). –

+1

В C++ нет простых способов сделать это. Существуют функции для поиска строк или символов в строках и функции для извлечения подстрок из строк. Но вы должны написать код, который ставит их вместе, чтобы сделать именно то, что вы хотите. – john

ответ

1

Вот как я должен это сделать,

string expression = "[ (a*b) + {(c-d)/f} ]" ; 
string token ; 

// appending an extra character that i'm sure will never occur in my expression 
// and will be used for splitting here 

expression.append("~") ; 
istringstream iss(expression); 
getline(iss, token, '~'); 

for(int i = 0 ; i < token.length() ; i++) { 
    if(token[i] != ' ') { 
     cout<<token[i] << ","; 
    } 
} 

выход будет: [, (, a, *, b,), +, {, (, c, -, d,), /, f,},],

3

Это называется lexical analysis (получение токенов из некоторой последовательности или потока символов), за которым следует parsing. Чтение, например. в первой половине Dragon Book.

Может быть LL parsing достаточно для вас ....

Есть много инструментов для этого, см this question (я хотел бы предложить ANTLR). Вероятно, в какой-то момент вам, вероятно, стоит построить abstract syntax tree.

Но это может не стоить усилий. Вы считали, что вложение какого-либо scripting language в ваше приложение, например. lua (см this и this ...), или gnu guile, python и т.д ...