Bootstrap

c语言strtok函数实用细节

strtok函数是字符串分割函数

// 函数原型
char *strtok(char *str, const char *delim);

str:  需要被分割的字符串指针

delim:  分割符指针 (可以是一个或多个分割符)

注意细节:

1.      第一个参数 str 在定义时,必须以数组的方式定义,如: char str[size];

         若以 char* str="xxxxx";  指针方式定义则会报错

char* str_tok(char* str){
	
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, " ");
   
   /* 继续获取第二个字符串 */
    token = strtok(NULL, " ");
 
   return token;
}

int main () {
   char* str = "ni hao ya!";
   char* ret_str = str_tok(str);
   printf("%s\n",ret_str);
   return 0;
}

这里定义了str_tok函数来处理,返回值为分割后得到的字符串地址,可以看到在以char* 定义时

编译运行出错。

2.      这里str当做参数传递时,可以做指针类型传递

char* str_tok(char* str){
	
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, " ");
   
   /* 继续获取第二个字符串 */
    token = strtok(NULL, " ");
 
   return token;
}

int main () {
   char  str[100] = "ni hao ya!";
   char* ret_str = str_tok(str);
   printf("%s\n",ret_str);
   return 0;
}

   

可以看到,将这个字符串当作参数传递给其他函数时,可以是指针,

但是源数据必须是数组,也就是字符串变量在定义时必须是以数组方式定义。

3.       strtok函数 返回分割符前面字符串的指针

        如1,2的演示,在str_tok函数中,使用了两次strtok, 第一次返回的指针token为 "ni" 的指针

而第二次strtok返回的指针再次赋值给token,返回token到main函数中打印为 "hao"  。

4.       strtok函数 会破坏原有字符串,将分割符的位置替换为 \0

如上面1,2所示的分割过程,第二次strtok时,strtok函数中第一个参数变为了NULL,即函数将 "ni" 分割出来后,将原本空格的位置 (空格也是一个字符,ASCII码值为32) 替换成了 \0 , 所以是从NULL开始分割,NULL和 \0 都代表无值或结束。最后的 "ni hao ya!" 字符串 实际是被分割成了     " ni \0 hao \0 ya! \0 " , 我们可以重新打印一下我们定义的字符串

第一个是分割函数返回的字符串,第二个是源字符串,可以发现,已经被修改了,打印碰见\0结束,所以输出 "ni"

5.        如果一个字符串需要多次分割我们可以加个循环,但要注意循环条件

char* str_tok(char* str){
	
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, " ");
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
        printf( "%s\n", token );
        token = strtok(NULL, " ");
   }
   return token;
}

strtok返回分割符前面的字符串指针,所以最后返回的一定的NULL,

如 "ni hao ya!",依次返回 "ni" 、"hao"、"ya!" 最后一个空格前的字符串 "ya!" 指针返回后,继续向后找,后面无字符,所以返回空。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;