strstr
、strtok
和 strerror
函数说明
以下是 C 标准库中三个常用字符串处理函数 strstr
、strtok
和 strerror
的详细说明,包括功能、用法和注意事项。
1. strstr
函数
功能:
strstr
用于在一个字符串中查找另一个字符串的次出现。
函数原型:
char *strstr(const char *haystack, const char *needle);
参数:
haystack
:要搜索的字符串(大字符串)。needle
:要查找的子字符串。
返回值:
- 如果找到子字符串,返回指向
haystack
中次出现needle
的指针。 - 如果未找到,返回
NULL
。
示例:
```c
include
include
int main() {
const char *str = "Hello, world!";
const char *sub = "world";
char *result = strstr(str, sub);
if (result) {
printf("Found substring: %s\n", result);
} else {
printf("Substring not found.\n");
}
return 0;
}
```
输出:
Found substring: world!
注意事项:
- 如果
needle
是空字符串,strstr
返回haystack
。 - 如果
haystack
或needle
是NULL
,行为未定义。
2. strtok
函数
功能:
strtok
用于将字符串分割成多个“标记”或“子字符串”,基于指定的分隔符。
函数原型:
char *strtok(char *str, const char *delim);
参数:
str
:- 次调用时,传入要分割的字符串。
- 后续调用时,传入
NULL
,表示继续分割上一次调用后的剩余部分。
delim
:分隔符字符串,表示用哪些字符作为分隔标记。
返回值:
- 返回指向下一个标记的指针。
- 如果没有更多标记,返回
NULL
。
示例:
```c
include
include
int main() {
char str[] = "Hello,world,this,is,C";
const char delim[] = ",";
char *token;
token = strtok(str, delim);
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, delim);
}
return 0;
}
```
输出:
Token: Hello
Token: world
Token: this
Token: is
Token: C
注意事项:
strtok
会修改原字符串,将分隔符替换为\0
。strtok
不是线程安全的。如果需要线程安全版本,可以使用strtok_r
(POSIX 标准)。- 如果在次调用时传入
NULL
,行为未定义。
3. strerror
函数
功能:
strerror
用于将错误码(errno
的值)转换为对应的错误消息字符串。
函数原型:
char *strerror(int errnum);
参数:
errnum
:错误码,通常是由库函数设置的全局变量errno
的值。
返回值:
- 返回指向错误消息字符串的指针。
示例:
```c
include
include
include
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (!file) {
printf("Error: %s\n", strerror(errno));
}
return 0;
}
```
输出(假设文件不存在):
Error: No such file or directory
注意事项:
strerror
返回的指针指向静态内存中的数据,下次调用网络或库函数时可能会被覆盖。如果需要长期保存错误消息,应将其复制到其他缓冲区。- 错误码应在调用
strerror
前保存,因为某些库函数可能会修改errno
。
对比
| 函数 | 功能 | 是否修改原字符串 | 线程安全 | 典型用途 |
|------------|-------------------------------|------------------|----------|------------------------------|
| strstr
| 查找子字符串 | 否 | 是 | 字符串搜索 |
| strtok
| 分割字符串 | 是 | 否 | 字符串解析、标记化 |
| strerror
| 将错误码转换为错误消息 | 否 | 是 | 错误处理、调试 |
注意事项
-
strstr
:- 适用于简单的子字符串查找。
- 不会修改原字符串。
-
strtok
:- 适用于分割字符串,但会修改原字符串。
- 不适合多线程环境,推荐使用
strtok_r
。
-
strerror
:- 适用于错误码到错误消息的转换。
- 返回的字符串指针指向静态内存,需小心使用。
希望以上说明对你理解这三个函数有所帮助!