模拟实现strtok和static的用法

本文探讨了如何模拟实现strtok函数,并详细阐述了strtok在使用过程中的注意事项,包括其对字符串的影响、线程安全性及返回值含义。此外,还深入讲解了static关键字在修饰局部变量和全局变量时的不同作用,强调了静态局部变量的存储特点和潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟实现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修饰局部变量改变了它的生存期(存储方式),修饰全局变量改了它的作用域(使用范围)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值