2013-03-24 3 views
0

저는 csv 문자열을 구문 분석하기 위해 C에서 strtok()을 사용하고 있습니다.csv 파일을 두 번 토큰 화합니다.

내 예를 들어 문자열 :

str= "name1 secondname1 cin,name2 secondname2 cin" 

구분 기호와 I 처음 사용 strtok를 ","와 두 번째 나는 ""와 문자열을 구분합니다.

char delims1[] = ","; 
char delims2[] = " "; 
char *result1 = NULL; 
char *result2 = NULL; 

result1 = strtok(str, delims1); 

while (result1 != NULL) { 

    result2 = strtok(result1,delims2); 

    while (result2 != NULL) { 
     printf("%s\n" ,result2); 

    } 

    result1 = strtok(NULL, delims1); 
}  

예상 결과는 다음과 같습니다에 StackOverflow에

name1 
secondname1 
cin 
name2 
secondname2 
cin 
+0

'str'과 'divided'란 무엇이며 무엇이 들어 있습니까? 그 코드를 보여줘야합니다. 또한, 실제로 어떤 결과를 얻고 있습니까? 당신은 당신의 질문이 무엇인지 진술하지 않습니다. –

+0

질문이 어디에 있습니까? –

+2

'strtok()'문제의 아름다운 데모. 거의 항상 사용하는 것은 나쁜 기능입니다. 그것의 결함의 목록은 다양하지만, 특히 당신이 원하는 것처럼 계속 진행되는 두 개의 분할 세트를 가질 수는 없습니다. 시도해야한다면,'strtok_r()'또는'strtok_s()'(POSIX와 Windows, 대략적으로)를 사용하십시오. 내부 while 루프에서'strtok()'에 대한 호출을 놓치고 있으므로'result2'가 변경되지 않으므로 코드는 영구 루프가됩니다. 'strtok() '이나 그 패밀리는 샘플 데이터로 작업 할 수 있지만 일반 CSV 데이터 구문 분석에는 현명하게 사용할 수 없습니다. –

답변

0

에 오신 것을 환영합니다. 질문 할 때 실제로 에 질문을하십시오..

그러나이 경우 예상되는 출력을 얻지 못한다고 가정합니다.

문제는 strtok이 마지막 통화 상태를 내부적으로 저장한다는 것입니다. 그래서 두 개의 다른 구문을 섞으면 문제가 생길 것입니다.

Microsoft 라이브러리의 C 라이브러리는 strtok_s을 제공하므로 상태 변수를 전달할 수 있습니다. 해당 컴파일러를 사용하는 경우 해당 함수를 사용하도록 전환하십시오. 그렇지 않으면 직접 작성해야 할 수도 있습니다.

또는 각 패스를 한 패스로 토큰 화하고 포인터를 배열에 저장할 수 있습니다. 그런 다음 두 번째 패스를 수행하고 배열의 각 문자열을 토큰 화합니다.

+0

이 코드의 몇 가지 문제점 중 하나는 'str'과 'divided'가 초기화되는 방식을 보여주지 않는다는 것입니다. 이것들은 두 개의 분리 된 문자열이며 우리는 그것이 무엇을 포함하고 있는지 알지 못합니다. 가장 심각한 문제는'result2'가 null이 아니면 두 번째'while' 루프가 무한 루프가 될 것이라는 것입니다. –

+0

사실입니다 만, 줄 사이를 읽으면 'strtok'에 대한 두 번째 호출이 루프 내에 새 구문 분석을 설정한다는 것이 확실합니다. 사용자가 자신의 프로그램을 실행하거나 관련된 모든 코드를 게시한다고 가정하면 이것이 현재 또는 미래의 문제의 근원입니다. 제목을 감안할 때, 그들은 그 일을하는 것이 잘못된 것이라고 생각하는 것 같습니다. 그래서 나는 그들의 의심이 옳았다는 것을 분명히합니다. =) – paddy

+0

strtok_r()도 참조하십시오. @paddy "라인들 사이에서의 읽기"는 SO 질문에 대한 좋은 접근 방법입니다. 때때로 코드는 실제로 당신이 두려워하는 것만 큼 나쁜 것입니다. –

관련 문제