模拟实现strtok
strtok使用注意事项:
1.strtok会破坏原来的字符串
例如:char str[1024] = “aaa bbb ccc ddd”;//正确的定义
char* str = “aaa bbb ccc ddd”;//错误的定义
2.strtok内部有个static 变量来记录上次切分的位置。
但是有一个致命隐患:“线程不安全”(操作系统)
3.strtok返回值如果是空指针说明切分完毕
4.如果有多个分割符相邻会被当做一个分割字符
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//函数的返回值表示字符串切分之后能切分的个数
int Split(char* input,const char* split_char,char* output[])
{
//Split参数:输入字符数组,分隔符,输出数组名
int output_index = 0;//定义一个常量(下标)
char* p = strtok(input, split_char);
while (p != NULL)
{
output[output_index] = p;
++output_index;
p = strtok(NULL, split_char);
}
return output_index;
}
int main()
{
char str[1024] = "aaa bbb ccc ddd";
char* result[10] = { 0 };
int n = Split(str, " ",result);
for (int i = 0; i < n; ++i)
{
printf("%s\n", result[i]);
}
//char* p = strtok(str, " ");
//while (p != NULL)
//{
// printf("%s\n", p);
// p = strtok(NULL, " ");
//}
system("pause");
return 0;
}
附加:static的使用注意事项:
一、修饰局部变量:
1.static类内部变量同auto(未加static)自动变量一样只能在定义该变量的函数内部使用,两者作用域相同。不同点在于:auto变量会随着函数退出而释放,static则不会,它会一直存在(占据存储空间)但不能使用它,换句话说:站着茅坑不拉屎
2.函数体内如果定义静态的局部变量同时进行了初始化,则以后不会执行该语句,也就是说:只执行一次该条语句;而自动变量(auto)则是每调用一次执行一次;
3.静态局部变量的初始化表达式必须是一个常量或者常量表达式,如果没有赋初始值系统自动赋值为0,而对于自动变量auto如果不赋初值,那它是一个不确定的值
局部静态变量的缺陷:占用内存时间长,可读性差;
二、修饰全局变量:
1.全局变量本身就是静态的存储方式,如果再加上static依然是静态的存储方式,只是它的作用域改变了,只在定义该变量的源文件中有效,在同一源程序的其他源文件中不能使用。非静态全局变量(不加static)则它的作用域是整个源程序,在其它源文件中也是有效的。
总结:static修饰局部变量改变了它的生存期(存储方式),修饰全局变量改了它的作用域(使用范围)