2013-12-08 2 views
0

Я пытаюсь ввести новую строку каждый раз, когда счетчик приходит к 4 ИЛИ если я сталкиваюсь с этим символом ']'.Проблема синтаксического анализа

Прямо сейчас, я могу получить свой код для создания новой строки каждый раз, когда мой счет равен 4, но когда я добавляю условие для ']', я получаю новую строку на каждой итерации. Я думаю, что это может быть вызвано моим chartDataString.find (']'), но я не уверен, как это исправить.

вы можете увидеть проблему с этим кодом ?:

int barCount = 0; 
size_t start = 0; 
size_t n = 0; 
int charCount = 0; 
while ((start = chartDataString.find(" |", start)) != string::npos) { 
    ++barCount; 
    start+=2; 
    charCount++; 
    if (barCount == 4 || chartDataString.find("]")) { 
     //cout<<"Number of bars: "<<barCount<<endl; 
     chartDataString.insert(start, "\n"); 
     barCount = 0; 
     charCount= 0; 
    } 
} 

ответ

0

Вы проверяете chartDataString, содержит ли ] вообще с chartDataString.find("]"). Также find вернет позицию, в которой находится символ, или string::npos, если он не найден. Единственный раз, когда find будет оценивать значение false, это когда символ найден в первом символе.

Вместо этого попробуйте:

if(barCount == 4 || chartDataString.at(charCount) == ']') { 

Проверяется, если текущий символ является ]. Заметьте, мне непонятно, какова ваша текущая позиция персонажа. Возможно, вам потребуется заменить charCount на start.

+0

Я думаю, что фактическая позиция для поиска может быть 'start', а не' charCount', судя по другой логике. Кроме этого, я считаю, что у вас есть правильная идея. –

1
if (barCount == 4 || chartDataString.find("]")) 

string.find() Если возвращается string::npos, то приведенное выше утверждение будет вычисляться true, потому что string::npos скорее всего, не 0.

На моей машине это 18446744073709551615, что программа ставит на true

Как указывал Аниш Рам в комментариях, string::nposis defined as:

static const size_t npos = -1; 

Итак, как size_t, это всегда будет положительное значение, которое при нажатии на логическое значение будет оцениваться как истинное.

попробуйте следующее:

#include <iostream> 
#include <string> 
using namespace std; 

int main(){ 
    if (string::npos) cout << "Entered if statement" << endl; 
    else cout << "DID NOT ENTER IF STATEMENT" << endl; 

} 

Я использую GCC 4.6.3 и выход программы:

Поступил если заявление

изменить код, чтобы читать:

if (barCount == 4 || chartDataString.find("]") != string::npos) 

И все должно работать нормально. Ну, они должны, по крайней мере, скомпилировать ... Если вы пытаетесь сделать, это перебрать все символы в строке, тогда вам действительно нужно проверять каждую позицию в строке вместо вызова string::find()

В этом case, вместо этого вы должны сохранить индекс в строке, а затем проверить string.at(index) == ']';.

+0

'std :: string :: npos' [кажется, что он определен как -1] (http://www.cplusplus.com/reference/string/string/npos/) –

+0

Да, я никогда не говорил, что вы опубликовали неправильно. Именно это и есть определение :) –

+0

@AnishRam: Обратите внимание, что это 'size_t', который определяется как -1, а не int. 'size_t' всегда будет положительным – AndyG

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