strtok()
작동 방식 을 이해하려면 먼저 정적 변수 가 무엇인지 알아야합니다 . 이 링크 는 잘 설명합니다 ....
의 작업의 핵심 strtok()
은 seccessive 호출 사이의 마지막 구분자의 위치를 보존하는 것입니다 (이것이 strtok()
a로 호출 될 때 전달되는 원래 문자열을 계속 구문 분석하는 이유 입니다.null pointer
연속 호출에서 ).
에서 제공하는 기능과 약간 다른 기능을 가진 strtok()
이라는 내 구현을 살펴보십시오.zStrtok()
strtok()
char *zStrtok(char *str, const char *delim) {
static char *static_str=0; /* var to store last address */
int index=0, strlength=0; /* integers for indexes */
int found = 0; /* check if delim is found */
/* delimiter cannot be NULL
* if no more char left, return NULL as well
*/
if (delim==0 || (str == 0 && static_str == 0))
return 0;
if (str == 0)
str = static_str;
/* get length of string */
while(str[strlength])
strlength++;
/* find the first occurance of delim */
for (index=0;index<strlength;index++)
if (str[index]==delim[0]) {
found=1;
break;
}
/* if delim is not contained in str, return str */
if (!found) {
static_str = 0;
return str;
}
/* check for consecutive delimiters
*if first char is delim, return delim
*/
if (str[0]==delim[0]) {
static_str = (str + 1);
return (char *)delim;
}
/* terminate the string
* this assignmetn requires char[], so str has to
* be char[] rather than *char
*/
str[index] = '\0';
/* save the rest of the string */
if ((str + index + 1)!=0)
static_str = (str + index + 1);
else
static_str = 0;
return str;
}
그리고 여기에 사용 예가 있습니다.
Example Usage
char str[] = "A,B,,,C";
printf("1 %s\n",zStrtok(s,","));
printf("2 %s\n",zStrtok(NULL,","));
printf("3 %s\n",zStrtok(NULL,","));
printf("4 %s\n",zStrtok(NULL,","));
printf("5 %s\n",zStrtok(NULL,","));
printf("6 %s\n",zStrtok(NULL,","));
Example Output
1 A
2 B
3 ,
4 ,
5 C
6 (null)
코드는 내가 zString이라는 Github 에서 유지 관리하는 문자열 처리 라이브러리에서 가져온 것입니다. 코드를 보거나 기여하십시오 :)
https://github.com/fnoyanisi/zString
strtok()
반환하기 전에 NUL로 토큰을 종료하여 인수 문자열을 수정합니다. 전체 버퍼 (str [])를 검사하려고하면 연속적인 호출 사이에 수정되는 것을 볼 수strtok()
있습니다.