strlen
的使用和模拟实现
strlen
函数用于计算C字符串(以空字符 '\0'
结尾的字符数组)的长度,不包括结尾的空字符。
使用:
#include <string.h>
char str[] = "Hello";
size_t len = strlen(str); // len 将会是 5
模拟实现:
size_t my_strlen(const char *str) {
const char *s;
for (s = str; *s; ++s) {}
return (s - str);
}
strcpy
的使用和模拟实现
strcpy
函数用于复制一个字符串到另一个字符串,包括结束的空字符。
使用:
#include <string.h>
char src[] = "Hello";
char dest[6];
strcpy(dest, src);
模拟实现:
char *my_strcpy(char *dest, const char *src) {
char *ret = dest;
while (*src) {
*dest++ = *src++;
}
*dest = '\0';
return ret;
}
strcat
的使用和模拟实现
strcat
函数用于将一个字符串追加到另一个字符串的末尾。
使用:
#include <string.h>
char dest[20] = "Hello";
char src[] = " World";
strcat(dest, src); // dest 现在是 "Hello World"
模拟实现:
char *my_strcat(char *dest, const char *src) {
char *ret = dest;
while (*dest) {
dest++;
}
while (*src) {
*dest++ = *src++;
}
*dest = '\0';
return ret;
}
strcmp
的使用和模拟实现
strcmp
函数用于比较两个字符串。如果第一个字符串在字典序上小于第二个,则返回负值;如果两个字符串相等,则返回0;如果第一个字符串大于第二个,则返回正值。
#include <string.h>
int result = strcmp("Hello", "World"); // result 将小于 0
模拟实现:
int my_strcmp(const char *s1, const char *s2) {
while (*s1 && (*s1 == *s2)) {
s1++;
s2++;
}
return *(const unsigned char *)s1 - *(const unsigned char *)s2;
}
在模拟实现中,每个函数都简单地遍历了字符串直到遇到结束的空字符。在 strcpy
和 strcat
中,目标字符串被逐字符更新,而 strcmp
则逐字符比较直到找到一个不匹配的字符或到达字符串末尾。
strstr
的使用和模拟实现
strstr
函数用于在一个字符串中查找子字符串的第一次出现。如果找到子字符串,它返回子字符串第一次出现的地址;如果没有找到,则返回 NULL
。
使用:
#include <string.h>
char str[] = "Hello, world!";
char substr[] = "world";
char *result = strstr(str, substr); // result 将指向 "world!"
模拟实现:
char *my_strstr(const char *haystack, const char *needle) {
if (!*needle) {
return (char *)haystack;
}
for (; *haystack; haystack++) {
if (*haystack == *needle) {
const char *h = haystack;
const char *n = needle;
while (*h && *n && *h == *n) {
h++;
n++;
}
if (!*n) {
return (char *)haystack;
}
}
}
return NULL;
}
在这个实现中:
- 我们首先检查
needle
是否为空字符串。如果是,根据strstr
函数的定义,返回haystack
的起始位置。 - 对于
haystack
中的每个字符,我们检查它是否与needle
的第一个字符相匹配。 - 如果找到匹配,我们在两个字符串上同时迭代,直到不再匹配或达到
needle
的末尾。 - 如果成功匹配了整个
needle
,返回当前haystack
的位置。 - 如果在整个
haystack
中都没有找到匹配,返回NULL
。
这种实现是直接和简单的,但可能不是最高效的,特别是对于较长的字符串或在字符串中频繁出现部分匹配的情况。在实践中,更高效的算法(如KMP算法)可能会被用于字符串匹配。
字符分类函数
C语言中的字符分类函数位于 <ctype.h>
头文件中,用于测试字符属于哪个类别(如字母、数字等)。一些常用的字符分类函数包括:
isalpha(c)
: 检查c
是否为字母。isdigit(c)
: 检查c
是否为数字。isalnum(c)
: 检查c
是否为字母或数字。isspace(c)
: 检查c
是否为空格字符。isupper(c)
: 检查c
是否为大写字母。islower(c)
: 检查c
是否为小写字母。
字符转换函数
字符转换函数也在 <ctype.h>
中定义,用于转换字符的大小写:
toupper(c)
: 将字符c
转换为大写(如果是小写字母)。tolower(c)
: 将字符c
转换为小写(如果是大写字母)。
strncpy
函数的使用
strncpy
用于将一个字符串复制到另一个字符串,最多复制 n
个字符。如果源字符串长度小于 n
,目标字符串的剩余部分将用空字符填充。
使用:
#include <string.h>
char src[] = "Hello";
char dest[10];
strncpy(dest, src, 10); // dest 将是 "Hello",后面跟着空字符
strncat
函数的使用
strncat
用于将一个字符串追加到另一个字符串的末尾,最多追加 n
个字符,并在最后添加一个空字符。
使用:
#include <string.h>
char dest[20] = "Hello";
char src[] = " World";
strncat(dest, src, 6); // dest 现在是 "Hello World"
strncmp
函数的使用
strncmp
用于比较两个字符串的前 n
个字符。它的工作方式与 strcmp
类似,但只比较前 n
个字符。
使用:
#include <string.h>
int result = strncmp("Hello", "Hello, world!", 5); // result 将是 0
strtok
函数的使用
strtok
用于将字符串分割成一系列的标记(tokens)。第一次调用时,strtok
接收要分割的字符串,之后的调用接收 NULL
,以继续从上次停止的地方开始分割。
#include <string.h>
char str[] = "Hello, world!";
const char delimiters[] = " ,!";
char *token = strtok(str, delimiters);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, delimiters);
}
strerror
函数的使用
strerror
用于返回一个描述错误代码含义的字符串。它通常用于处理与标准错误相关的信息。
使用:
#include <string.h>
#include <errno.h>
errno = ENOENT; // 设置错误码
printf("%s\n", strerror(errno)); // 打印错误信息