6. strstr
查找字符子串:找到了返回字符串的首地址,找不到就返回空指针NULL
这里需要注意的是
对于 abcdefgh def,能够查到def
这个字串,但是当我们%s
打印时,打印出来的却是defgh
,因为我们只是返回了源字符串包含这个字串的首地址。
另外如果字符串中有多个相同的字串,那么返回的是第一次出现这个字串的首地址。
7. strtok
char * strtok (char* str, const char* sep)
sep
参数是个字符串,定义了用作分隔符的字符集合
比如对于192.168.1.1 --> 192 168 1 1
或者
xinghy@gmail.com --> xinghy gmail com
我们就可以定义sep
分隔符的集合,然后进行分割查找,这里就是char* sep = "@.";
-
然后会将下一个标记分隔符改成
\0
,并返回当前字符串首地址,此时就是xinghy\0gmail.com
,并返回x
地址,而再次调用该函数时,会找下一个分隔符,变成\0
,然后返回下一个字串的首地址,返回g
的地址,并把.
改成\0
,最后再调用次函数时,一直到\0
都没有找到标记,直接返回最后一个字串的地址c
-
注意的是,strtok是会更改字符串的内容的,因此使用此函数之前,最好有一个临时拷贝并且可被修改
-
当
strtok
第一个参数不是NULL
时,函数将会找到第一个标记,strtok
函数将保存它在字符串中的位置 -
strtok
第一个参数是NULL
,函数将在同一个字符串中被保存的位置开始,查找下一个标记 -
如果没有更多的标记并且此时剩余的串为空,则返回NULL指针
//所以可以使用for循环来设计
//for循环的初始条件,只初始化一次,所以可以对应着第一次第一个参数不是NULL的时候
//for循环的第三个,就可以对应着第一个参数是NULL的时候
char* ret = NULL;
for (ret = strtok(arr, sep); ret != NULL; ret = strtok(NULL, sep))
{
printf("%s\n", ret);
}
8. strerror
char* strerror (int errnum);
返回错误码,所对应的错误信息。
errnum
错误码:
- 0:No error
- 1:Operation not permitted
- 2:No such file or directory
- …
实际在使用的时候,并不是通过strerror(1)
这样使用,而是通过引用errno.h
头文件,然后调用strerror(errno)
,这里的errno
是一个全局的错误码的变量。当C语言的库函数在执行过程中发生了错误,就会把对应的错误码赋值到errno
这个变量中去
应用
// 打开文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
//如果想知道文件打开失败的原因
printf("%s\n", strerror(errno));
}else
{
printf("open file success...\n");
}