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!" 指针返回后,继续向后找,后面无字符,所以返回空。