不得不看的字符串函数细节(strlenstrcpystrtok)

Posted 燕麦冲冲冲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不得不看的字符串函数细节(strlenstrcpystrtok)相关的知识,希望对你有一定的参考价值。

首先接受挑战

输入结果应该是多少呢?

int main()
{
	char* str1 = "abcdef";
	char* str2 = "abc";
	if ((strlen(str2) - strlen(str1)) > 0)
	{
		printf("hehe\\n");
	}
	else
	{
		printf("haha\\n");
	}
	return 0;
}

答案是:hehe

因为strlen函数的返回值类型是无符号整形,所以两个数相减得到的-3又因为类型转换变成了无符号整型,是一个很大的数,真是虾仁猪心啊!

由此可知,库函数的实现有很多奥秘,我接下来再举几个例子。

int main()
{
	char src[] = { 'a','b','c' };
	char dest[20] = "hehe";
	strcpy(dest, src);
	printf("%s\\n", dest);
	return 0;
}

当你运行这样的代码时,会出现烫烫烫的乱码。

这是因为strcpy这个函数的实现原理是:把源字符串交给一个指针变量管理,通过指针变量把源字符串一个一个地赋值给目标字符串,直至遇到’\\0’后停下,而这个程序中的源字符串不包含’\\0’,会导致指针越界访问。

为了更好的运用这个函数,需要尝试模拟实现strcpy函数。

char* my_strcpy(char* dest, char* src)
{
	assert(dest && src);//防止空指针的出现
	char* tmp = dest;//储存目标字符串的首地址以便返回
	while (*dest++ = *src++)
	{
		;
	}
	return tmp;
}

有时候,我们需要一种功能,可以帮我们在一段文字中屏蔽掉某些符号或者文字。

这就是strtok函数的功能。

不过这个函数用起来就需要小心了。

int main()
{
	char str[] = "-This, is a sample string.aha";
	char* pch;
	pch = strtok(str, ",.-");
	while (pch != NULL)
	{
		printf("%s\\n", pch);
		pch = strtok(NULL, ",.-");
	}
	return 0;
}

想要输出全部屏蔽了之后的字符串,需要根据所屏蔽符号或字符的多少来决定,要屏蔽几个就要调用几次这个函数,第一次使用strtok函数时,其第一个参数为这个字符串的首地址,接下来的每次第一个参数都为NULL

这么麻烦的原因是,每次调用完后,只会返回所屏蔽字符所处的地址。

以上是关于不得不看的字符串函数细节(strlenstrcpystrtok)的主要内容,如果未能解决你的问题,请参考以下文章

PHP高手干货分享:不能不看的50个细节!

PHP高手干货分享:不能不看的50个细节!

[转]PHP高手干货分享:不能不看的50个细节!

字符与字符串函数

字符与字符串函数

JAVA编程不得不看的几本经典书籍