2017-01-01 9 views
0

여러 줄이 포함 된 문자열에서 토큰으로 데이터를 읽으려고합니다. 는 I 코드를 사용strtok에서 개행 문자를 처리하는 방법은 무엇입니까?

char * pch; 
    pch = strtok ((char*)MyStr.c_str()," ,|,\n"); int i = 0; 
    while (pch != NULL && i++ < 10) 
    { 
     cerr << i << ':' << pch << ' '; 
     pch = strtok (NULL, " ,.-"); 
    } 

입력이

std::string SP1271 = "1271,1\n" 
"0,44248,8,45040,20,1,0,100\n" 
"545,590,603,564,566,598,569,585,586,578\n"; 

하고 출력

1:1271 2:1 
0 3:44248 4:8 5:45040 6:20 7:1 8:0 9:100 
545 10:590 

가 합법적 세퍼레이터로서 '\ n'을 사용하는가요?

+1

왜 컴파일하고 확인? – kabanus

+5

상수'c_str()'반환에'strtok'을 사용하는 것은 좋은 생각이 아닙니다. (강제적 인 non-const cast, 더러운 해킹 !!). _real_ C++에서는 구분자에 따라 텍스트를 분할하는 실제 방법을 살펴보아야합니다. –

+1

네, 구분 기호로'\ n'을 사용하는 것은 합법입니다. 그것은 다른 어떤 캐릭터와도 같습니다. 단, 첫 번째'strtok' 호출에서는'\ n'을 구분 기호로 전달하지만 후속 호출에서는 전달하지 않습니다. 그래서 "1 \ n0"이 하나의 토큰으로 끝나는 이유입니다. 왜냐하면'\ n'은 어떻게 든 특별하기 때문이 아니라 토큰에 대한 구분자로 취급하기 때문에. –

답변

1

strtok()을 사용하는 것은 매우 바람직하지 않습니다.이 기능은 변경되지 않아야하는 원본 문자열을 변경할 수 있기 때문에 const입니다.

또한 작동 할 수 있다고해도 후속 루프 strtok()에서 토큰 구분 기호로 '\ n'을 예상하지 않았습니다. 따라서 토큰 구분 기호 문자열을 모두 정렬하는 것이 좋습니다.

왜 C++ 기능을 사용하지 :

size_t pe; 
for (size_t pb=0; pe=MyStr.find_first_of(" ,-\n", pb); pb=pe+1) 
{ 
    cout << MyStr.substr(pb, (pe==string::npos ? pe:pe-pb))<< " "; 
    if (pe==string::npos) 
     break; 
}