2013-05-01 2 views
-1

Все:C++ обработка строк

У меня один вопрос в струнной разборе:

сейчас, если у меня есть строка, как «+ 12 + 400-500 + 2: + 13-50-510 + 20-66 + 20: "

Как я могу рассчитать общую сумму каждого сегмента (можно рассматривать как конец одного сегмента). В настоящее время, что я могу понять, как использовать только для Переберите и проверить +/- знак, но я не думаю, что это хорошо для метод универсальный для решения такого рода проблем :(

For example, the first segment, +12+400-500+2 = -86, and the second segment is 
+13-50-510+20-66+20 = -573 

1) The number of operand is varied(but they are always integer) 
2) The number of segment is varied 
3) I need do it in C++ or C. 

I на самом деле не думаю, что это как очень простой вопрос для большинства новичков, а также я буду утверждать, что это не домашнее задание. :)

лучше,

+0

HTTP: // StackOverflow. com/questions/236129/splitting-a-string-in-c –

+0

Это домашнее задание? – Sven

+0

Нет, конечно нет. :) – Kuan

ответ

3

Поскольку строка заканчивается в толстой кишке, она проста в использовании find и substr отделить части строки разбиты на разделы ':', как это:

string all("+12+400-500+2:+13-50-510+20-66+20:"); 
int pos = 0; 
for (;;) { 
    int next = all.find(':', pos); 
    if (next == string::npos) break; 
    string expr(all.substr(pos, (next-pos)+1)); 
    cout << expr << endl; 
    pos = next+1; 
} 

Это разбивает исходную строку на части

+12+400-500+2: 

и

+13-50-510+20-66+20: 

С istream s занимают ведущие плюс, а также ведущих минус, вы можете разобрать число с помощью >> оператора:

istringstream iss(expr); 
while (iss) { 
    int n; 
    iss >> n; 
    cout << n << endl; 
} 

С этими двумя частями в руке, вы можете легко составить до отдельных номеров, и производить желаемое вывод. Вот quick demo.

+0

Спасибо, dasblinkenlight !, Я попробую это. – Kuan

+0

Это потрясающе, я новичок на C++, можете ли вы рассказать мне, как и где я могу найти такое специальное использование? Или вы можете дать мне ссылку на что-то вроде «C++ secret»? – Kuan

+0

@Kuan Существует абсолютно, определенно, не секрет для C++, это просто требует времени, чтобы «получить» его. Вы можете найти информацию о различных классах C++ в Интернете. Например, 'std :: string' описывается [здесь] (http://www.cplusplus.com/reference/string/string/); 'std :: istringstream' является [здесь] (http: //www.cplusplus.ком/ссылки/sstream/istringstream /). – dasblinkenlight

1

Вам нужно отделить операнды и операторы. Для этого вы можете использовать два типа данных очереди для операндов, один для операторов

+0

Любые детали, пожалуйста? – Kuan

0

раздел :, затем по +, затем по -. переводите на int, и вот вы где.

0

Ваш язык выражение кажется регулярным: вы можете использовать регулярное выражение библиотеки - как boost::regex - чтобы соответствовать номерам, знаки и сегменты в группах напрямую, с чем-то вроде

((([+-])([0-9]+))+)(:((([+-])([0-9]))+))+