-
strtok函数
分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。
原型:extern char *strtok(char *s, char *delim);
用法:#include <string.h>
功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。返回指向下一个标记串。当没有标记串时则返回空字符NULL。
2.strtok函数不能嵌套调用!!!
strtok之所以可以在第一次使用strtok(char * src , const char * control)后,能够通过调用strtok(NULL, control)来继续分割字符串,是因为在strtok函数内部定义了一个静态字符指针用以保存下次要分割字符串的位置,如果你要玩strtok嵌套的话,就会被这个静态指针弄的一踏糊涂了。所以不能嵌套。
功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。返回指向下一个标记串。当没有标记串时则返回空字符NULL。
#include<string.h>
#include<stdio.h>
int
main(
void
)
{
char
input[16]=
"abc,d"
;
char
*p;
p=
strtok
(input,
","
);
if
(p)
printf
(
"%s\n"
,p);
p=
strtok
(NULL,
","
);
if
(p)
printf
(
"%s\n"
,p);
return
0;
}
注意!!!
1.strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。
strtok之所以可以在第一次使用strtok(char * src , const char * control)后,能够通过调用strtok(NULL, control)来继续分割字符串,是因为在strtok函数内部定义了一个静态字符指针用以保存下次要分割字符串的位置,如果你要玩strtok嵌套的话,就会被这个静态指针弄的一踏糊涂了。所以不能嵌套。
如果要解决使用strtok函数嵌套调用的功能,简单易行的办法将第一次strtok函数分解出来的字符串保存起来,在strtok函数循环结束,对每一个子串起一个strtok函数的循环
char *delim_1 = ";";
char *delim_2 = ",";
char *p = NULL;
char *q = NULL;
char* field_1[3] = {0};
char* field_2[3][20] = {0};
char temp[100] = {0};
int total = 0;
p = strtok(readbuff,delim_1);
total = atoi(p);
for (i = 0;i < 3;i++) {
p = strtok(NULL,delim_1);
if (p != NULL) {
field_1[i] = p;
}
else {
break;
}
}
for (i = 0;i < 3;i++) {
q = strtok(field_1[i],delim_2);
field_2[i][0] = q;
for (j = 1;j < 20;j++) {
q = strtok(NULL,delim_2);
if (q != NULL) {
field_2[i][j] = q;
}
else {
break;
}
}
}
for (i = 0;i < 3;i++) {
for (j = 0;j < 20;j++) {
if (field_2[i][j] != NULL) {
printf("%s\n",field_2[i][j]);
}
else {
break;
}
}
}
char *delim_2 = ",";
char *p = NULL;
char *q = NULL;
char* field_1[3] = {0};
char* field_2[3][20] = {0};
char temp[100] = {0};
int total = 0;
p = strtok(readbuff,delim_1);
total = atoi(p);
for (i = 0;i < 3;i++) {
p = strtok(NULL,delim_1);
if (p != NULL) {
field_1[i] = p;
}
else {
break;
}
}
for (i = 0;i < 3;i++) {
q = strtok(field_1[i],delim_2);
field_2[i][0] = q;
for (j = 1;j < 20;j++) {
q = strtok(NULL,delim_2);
if (q != NULL) {
field_2[i][j] = q;
}
else {
break;
}
}
}
for (i = 0;i < 3;i++) {
for (j = 0;j < 20;j++) {
if (field_2[i][j] != NULL) {
printf("%s\n",field_2[i][j]);
}
else {
break;
}
}
}