2013-12-08 4 views
0

제 카운트가 4가 될 때마다 새 라인을 입력하려고합니다.문자열 파싱 문제가 발생했습니다.

지금 당장은 카운트가 4가 될 때마다 새 코드를 만들 수 있지만 '반복 횟수'에 조건을 추가하면 모든 반복마다 새 줄이 생깁니다. 이 내 chartDataString.find (']')에 의해 발생할 수 있다고 생각하지만 그것을 수정하는 방법을 잘 모르겠습니다. 당신은 chartDataString 전혀 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

당신은?이 코드로 문제를 볼 수 있습니다. 또한 find은 문자가있는 위치를 반환하거나 찾을 수없는 경우 string::npos을 반환합니다. find이 거짓으로 평가하는 유일한 시간은 문자가 첫 번째 문자에있는 경우입니다.

대신, 시도 :

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

이 검사를 현재의 문자가 ] 경우. 현재 캐릭터 위치가 무엇인지는 분명치 않습니다. charCountstart으로 바꿔야 할 수도 있습니다. string::npos 가장 가능성이 있기 때문에

+0

검색 할 실제 위치는 다른 로직에 의해 판단되는'charCount'가 아니라'start' 일 수도 있다고 생각합니다. 그것 이외에, 나는 당신이 여기에 맞는 생각을 가지고 있다고 믿는다. –

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

string.find()하면 반환 string::npos 후 위의 문장은, true로 평가하지 않습니다이 프로그램이 true

에 캐스트 18,446,744,073,709,551,615, 내 시스템에서 0

Anish 램이 의견에서 지적한대로, string::npos :

static const size_t npos = -1; 

따라서 size_t으로 항상 부울로 캐스팅되면 true로 평가되는 양수 값이됩니다.

#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.at(index) == ']';을 확인해야합니다.

+0

'std :: string :: npos' [-1로 정의 된 것으로 보입니다.] –

+0

네가 올린 글이 틀렸다는 말은 결코하지 않았다. 그냥 정의입니다. –

+0

@AnishRam : int가 아닌 -1로 정의 된 'size_t'입니다. 'size_t'는 항상 긍정적입니다. – AndyG