2009-10-12 4 views

답변

10

쉬운 방법 : 사용 strtok() 또는 strtok_r 문자열에서 제거됩니다 처음 두 토큰을 얻을 수 있습니다, 그래서 문자열 자체는 당신이 찾고 있던 세 번째 토큰을 될 것입니다.

하드 방법 : 스스로를 구문 분석 :(

strtok를이 C 문자열 라이브러리에, 그것은 그대로 유지해야하는 경우, 원래의 문자열이 너무 조심 돌연변이 먼저 문자열을 복사합니다

가능. 예 :

//#include <string.h> 

char input[] ="first second third forth"; 
char delimiter[] = " "; 
char *firstWord, *secondWord, *remainder, *context; 

int inputLength = strlen(input); 
char *inputCopy = (char*) calloc(inputLength + 1, sizeof(char)); 
strncpy(inputCopy, input, inputLength); 

firstWord = strtok_r (inputCopy, delimiter, &context); 
secondWord = strtok_r (NULL, delimiter, &context); 
remainder = context; 

printf("%s\n", firstWord); 
printf("%s\n", secondWord); 
printf("%s\n", remainder); 

getchar(); 
free(inputCopy); 

이 잘 작동하고 unmutated 원래의 문자열로 스레드를해야

+0

또 다른 문제는 strtok()가 내부 정적 변수를 사용하므로 스레드로부터 안전하지 않다는 것입니다. 문제가있는 경우 strtok_r()을 사용하십시오. –

+0

strtok_r –

+2

을 사용하는 매우 사실이며 변경된 예제입니다. 나머지 문장이 아니라 미리 알림의 첫 번째 토큰을 제공합니다. –

3
+1

@ BartłomiejSemańczyk 실제로 링크를 꺼내면 여전히 'strtok'이라고 표시되기 때문에 여전히 답변입니다. – MicroVirus

+0

@ BartłomiejSemańczyk 나는 09 년에 이것을 대답했다. 링크는 여전히 작동한다! –

2

을 당신이를 단락을 정의해야합니다. ers 먼저. strtok에는 몇 가지 문제가 있습니다 (문제를 해결할 수있는 인수를 수정 함). 나는 문자열을 읽고 sscanf부터 본격적인 파서에 이르는 사용자 정의 파서를 실행하는 것을 선호합니다. 좀 더 자세하게 게시하십시오.

+0

+1''sscanf()'는 단어가 공백이 아닌 것을 의미하므로 변환 지정자를 쉽게 만들고 strtok() 및 친구들의 모든 문제를 깔끔하게 피해야하므로 잘 작동합니다. –

관련 문제