内容重点:
重点介绍处理字符和字符串的库函数的使用和注意事项
下面是将要介绍的几个函数:
- 求字符串长度 strlen
- 长度不受限制的字符串函数 strcpy strcat strcmp
- 长度受限制的字符串函数介绍 strncpy strncat strncmp
- 字符串查找 strstr strtok(本节)
- 错误信息报告 strerror
- 字符操作
- 内存操作函数 memcpy memmove memset memcmp
strtok
char * strtok ( char * str, const char * sep );
Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part ofstr1
- sep参数是个字符串,定义了用作分隔符的字符集合。
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
- strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
sep参数是个字符串,定义了用作分隔符的字符集合。第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
下面的char buf[]对要被操作的函数进行临时拷贝
int main()
{
char arr[] = "qwe@12345.net";
char buf[30] = { 0 };
strcpy(buf, arr);
printf("%s\n", buf);
return 0;
}
同时要求的是strtok函数的第一个参数不为空,后面再执行这个函数的第一个参数为空。
先找到第一个位置是@,然后把@改成‘\0’,返回z的地址并保存结束的位置,然后打印在'\0'处停下来。这里传空指针的意思是从刚刚的位置上(上一个被指针保存好的位置),继续寻找分隔符".",然后再找,发现找不到了,此时返回空指针。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "qwe@12345.net";
char buf[30] = { 0 };
strcpy(buf, arr);
const char* p = "@.";
char* str = strtok(buf, p);
printf("%s\n", str);
str = strtok(NULL, p);//
printf("%s\n", str);
str = strtok(NULL, p);//
printf("%s\n", str);
return 0;
}
所以优化成:
//qwe12345678@qq.com
//分隔符 —— @.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int main()
{
char arr[] = "qwe12345678@qq.com";
const char* p = "@.";
char buf[30] = { 0 }; //qwe12345678@\0qq\0com\0所以不能改成const char
char* str = NULL;
strcpy(buf, arr);//将数据拷贝一份,处理arr数组的内容
for (str = strtok(buf, p); str != NULL; str = strtok(NULL, p))
{
printf("%s\n", str);
}
return 0;
}
输出结果:
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
同时需要注意:这次指针指向的位置在下一次函数调用的时候还是可以被继续使用的,因此这个函数是有记忆功能的。
示例
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "- This, a sample string.";
char* pch;
printf("Splitting string \"%s\" into tokens:\n", str);
pch = strtok(str, " ,.-");
while (pch != NULL)
{
printf("%s\n", pch);
pch = strtok(NULL, " ,.-");
}
return 0;
}
输出结果:
(本节完)