不得不看的字符串函数细节(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)的主要内容,如果未能解决你的问题,请参考以下文章