??订阅专栏:字符串函数
💚关注博主:翻斗花园第一代码手牛爷爷
🐳前言
续上第二篇,我们接下来继续介绍几种字符串函数,想要熟练的运用字符串函数,对函数的一些实现细节的了解是必不可少的。除此之外,跟应该多加练习,敲起来!
🌸函数介绍
char * strtok ( char * str, const char * delimiters ); 字符串切割函数
delimiters 参数是一个字符串,定义了用作分割符的字符集合。
- 第一个参数指定一个字符串,它包括了0个或者多个由
delimiters 字符串中一个或者多个分割符分割的标记。 strtok 函数找到str 中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。(strtok 函数会改变被操作的字符串,所以在使用strtok 函数切分的字符串一般都是临时拷贝的内容并且可以修改)strtok 函数的第一个参数不为NULL ,函数将找到str 中第一个标记,strtok 函数将保存他在字符串中的位置。strtok 函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。- 如果字符串中不存在更多的标记,则返回
NULL 指针。
🌺strtok函数使用
strtok 函数和其他字符串函数相比较来说非常特殊,具体的我们用一段代码来分析,如下代码。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "www.baidu@qq123456789";
char arr2[50] = { 0 };
strcpy(arr2, arr);
const char* p = ".@";
char* ret = NULL;
ret = strtok(arr2, p);
printf("%s\n", ret);
ret = strtok(NULL, p);
printf("%s\n", ret);
ret = strtok(NULL, p);
printf("%s\n", ret);
return 0;
}
我们arr数组就是一段字符串数组,我们的p 则是指向一段分割符的集合。strtok 函数对字符串进行切割就是利用分割符对字符串进行切分,并将分割符修改为\0 ,然后返回标记的地址。所以我们说在使用strtok 函数切分的字符串一般都是临时拷贝的内容并且可以修改。我们来观察运行的结果,如下图。 我们之所以说strtok 这个函数特殊,就是因为如果我们要对一段字符串进行切分的话,我们只需要在第一次调用的时候把字符串传给它,在后面的调用就只需要传NULL 给它就行了,该函数具有记忆功能,会在后来的调用自动在上一次的调用的后面继续向后进行,在遇到分割符时,会将分割符再次修改为\0 ,然后返回这一段的标记地址。我们还可以通过监视窗口观察strtok 函数将分割符修改的情况以及返回标记地址的情况,如下图。 我们可以观察到分割符. 和@ 被修改为\0 ,并且依次返回每一段标记的的首地址。在理解了strtok 函数的机制之后,我们可以把代码写的更加简介一点,如下代码。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "www.baidu@qq123456789";
char arr2[50] = { 0 };
strcpy(arr2, arr);
const char* p = ".@";
char* ret = NULL;
for (ret = strtok(arr2, p); ret != NULL;ret = strtok(NULL, p))
{
printf("%s\n", ret);
}
return 0;
}
??strtok函数模拟实现
#include <stdio.h>
#include <string.h>
char* my_strtok(char* arr, const char* p)
{
static char* val = NULL;
if (arr != NULL)
{
val = arr;
}
else
{
val++;
arr = val;
}
if (*val == '\0')
{
return NULL;
}
else
{
while (*val != '\0')
{
for (int i = 0; *(p + i) != '\0'; i++)
{
if (*val == *(p + i))
{
*val = '\0';
return arr;
}
}
val++;
}
return arr;
}
}
int main()
{
char arr[] = "www.baidu@qq123456789";
char arr2[50] = { 0 };
strcpy(arr2, arr);
const char* p = ".@";
char* ret = NULL;
for (ret = my_strtok(arr2, p); ret != NULL; ret = my_strtok(NULL, p))
{
printf("%s\n", ret);
}
return 0;
}
char * strerror ( int errnum ); 错误打印函数
erenum 是错误码,在传给strerror 函数一个错误码后,函数会返回一个地址,根据地址可以打印错误信息。- 错误码是C语言库函数里自带的报错时候的错误码。
??strerror函数使用
strerror 函数可以利用错误码转换成错误信息,具体转换我们用代码进行观察,如下代码。
#include <stdio.h>
#include <string.h>
int main()
{
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
printf("%s\n", strerror(5));
return 0;
}
错误信息打印如下图。 我们可以看到,每个错误码都对应着不同的错误信息,我们在程序的设计中,合理的运用strerror 函数可以帮助我们更快的找到错误的出处。
??总结
本章介绍了两个字符串函数strtok 函数和strerror 函数,strtok 函数的使用需要注意它的一些特别之处,strerror 函数是根据错误码打印错误信息,可以帮助我们快速的找出程序的错误,我们在这就不对strerror 函数进行模拟实现。字符串函数的介绍在这里也就告一段落了,希望大家多多支持,如有错误之处还望指正。
|