1.strtok函数 — 分割字符串函数
2.strerror函数 — 错误报告函数
1.strstok函数的用法
char* strtok(char* str, const char* delimiters);
直接看函数的声明:
参数1:要切割的地址,参数2:切割时的标记物
注意:strtok函数本身会记住第一次传过来的这个地址,第一次传过来时:如果这个地址为空,则strtok函数返回一个空指针,如果这个地址不为空,则返回传过来的首地址。
由于这个函数的第二个参数为要切割的标记物,假如这个标记物不存在,返回的也是第一次传进来的要切割的函数的首地址。
下面举例说明:
int main()
{
char arr[] = "abcd@.dde.agc";
//192.168.31.121
//ip地址:点分十进制的表示方式
char* p = "--"; // 标记物
char* ret = NULL;
for (ret = strtok(arr, p); ret != NULL; ret = strtok(NULL, p))
{ //这个函数自己会识别上一次标记的位置
printf("%s\n",ret);
}
}
找不到标记物,返回的是字符串的首地址。
那要是找到了标记物呢?
打印出来的结果是这样的:
调试后发现:
第一次切割时,标记物的位置被改成了 ‘\0’
你可能会问,在循环内部,为什么 是 ret = strtok (NULL,p) 呢?传递的不应该是arr吗,
是的,传递的确实不是arr,而是 NULL,为什么呢?
是因为strtok函数内部,在第一次接收到字符串的地址后,当它切割成功时,会自己记住这个切割点的位置,下一次调用这个函数时,它会记住这个位置并且从该位置的下一个位置开始寻找切割物。
这就是为什么第二次及以后调用strtok函数时,传递的第一个参数是NULL的原因。
当我们进行第二次切割时,会发现一个奇怪的问题:
为什么第二次切割没有将第一个@后的 . 改成 ‘\0’ ?,而是在之后的 . 改成 ‘\0’ 呢?
如下图:
进一步探讨后发现:
当第一次切割成功后,第二次切割时,我们知道,这个函数会记住上一次切割点并从下一个位置开始寻找切割点,然而,当这所谓的下一个位置,是切割点时,这个函数直接不理,不改成 ‘\0’,直接跳过继续寻找,知道找到的字符不是切割标记字符时,从这以后,才开始真正意义上的找切割点,并更改为 \0
也就是说,第一次切割成功后,abcd@.@@中的第一个@,被改成了 ‘\0’,第二次调用该函数时, .@@不会被改成 ‘\0’,而是直接跳过,继续寻找,知道找到不是切割物的字符。
看到这里,你应该明白了strtok函数的使用方法。
2.strerror函数的使用方法
strerror–错误报告函数,它会返回错误码,所对应的错误信息
错误码 错误信息
0 No error
1 Operation not permitted
2 No such file or directory
errno : 是一个全局的错误码的变量
当c语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errmo中
举例:
int main()
{
FILE* fp = fopen("text.txt", "r");
if (fp == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
printf("open file successfully\n");
}
}
当我们打开文件时,由于电脑中没有这个文件,故会返回错误报告:
将errno放在strerror中,是为了将该错误码所对应的错误信息放到strerror中,以便返回来打印。
该函数的使用方法就这么简单,一般是配合打开文件等操作使用。