2013-12-09 2 views
0

Я хочу разобрать строку и заменить некоторые символы в этой строке, которую я пытался использовать разделителем, но это не сработало правильно.Как разобрать строку и заменить некоторые символы строки?

Это строка, я хочу разобрать:

chartData = [T44E-7 | x |G-7 | x | 
Bb^7 | x |Bh7 |E7#9 |A-7 | x |F#h7 | x |F-7 | x Q |C-7 | x |B7#9 | x Z  Y{QC-7 | x |Ab^7 | x } 

И это конечный результат я хочу:

[T44E-7 | x |G-7 | x | 

| Bb^7 | x |Bh7 |E7#9 | 

|A-7  | x |F#h7 | x | 

|F-7  | x Q |C-7 | x | 

|B7#9  | x ||   

|:QC-7  | x |Ab^7 | x :| 

Я также хочу, чтобы заменить й с%, Z с ||, {с |: и} с: |.

Вот функция синтаксического анализа, что у меня есть:

void parseChartData(string chartDataString){ 
    string token; 
    if(!chartDataString.empty()){ 
     chartData.clear(); 
     chartData.append(chartDataString); 
     string delimiter = "|"; 
     int pos = 0; 
     while ((pos = chartData.find(delimiter)) != pos) { 
      token = chartData.substr(0,pos); 
      cout << token << endl; 
     } 
    } 
} 
+0

чем вопрос? – Massimo

+0

как разбирать строку, поэтому я могу показать только 4 бара за строку –

ответ

0

Первое решение, которое я думаю, что это одна.

int occurrencies = 0; // number of "|" found 
int curPos = 0; 
int startPos = 0; 
string delimiter = "|"; 
// find the next delimiter from the last one found, not from the beginning of chartData 
while ((pos = chartData.find(delimiter, curPos)) != string::npos) { 
    curPos = pos+1; 
    occurrencies++; 

    // print something only if 4 delimiters have been found 
    if (occurrencies%4 == 0) { 
     // print the part from the last character printed to the last delimiter found 
     string part = chartData.substr(startPos,pos-startPos); 
     cout<<part<<endl; 
     // after printing, the last character printed become the beginning of the next token 
     startPos = pos+1; 
    } 
} 

// at the end print the remaining part of chartData 
string lastPart = chartData.substr(startPos,string.size()-startPos); 
cout<<lastPart<<endl; 

Он должен работать

+0

Когда я это пробовал, программа застряла в бесконечном цикле –

+0

Просто измените «curPos = pos;» в "curPos = pos + 1;". Цикл infine состоит в том, что он всегда находит один и тот же символ. То же самое для «startPos = pos», которые становятся «startPos = pos + 1». – Massimo

Смежные вопросы