1. 字符串长度
strlen用于计算字符串的长度,但不包含结束符 NUL
size_t strlen(char const *string);
strlen 返回一个类型为 size_t 的值,这个类型在头文件 stddef.h 中定义,是一个无符号整数类型。
2. 复制字符串
char *strcpy(char *dst, char const *src);
strcpy 函数把参数 src 字符串 复制到 dst 参数。 如果这两个参数在内存中出现重叠,结果是未定义的。
由于 dst 参数将进行修改,所以它必须是个字符数组或者是一个指向动态分配内存的数组的指针,不能使用字符串常量。
目标参数内容会被有效地删除。(复制时连同 NUL 一起复制)。应确保目标字符数组的空间足以容纳需要复制的字符串,否则会覆盖数组后面未知内存空间。
strcpy 返回指向目标数组的指针。
3.连接字符串
char *strcat(char *dst, char const *src);
strcat 函数把 src 字符串复制添加(连接)到 dst 字符串后面。其要求 dst 参数原先已经包含了一个字符串(可以是空字符串)。
若两参数内存位置重叠,结果未定义。和前面一样必须保证目标字符串空间足够连接所用。
strcat 返回指向目标数组指针。
4. 字符串比较
int strcmp(char const *s1, char const *s2);
strcmp 用于比较两个字符串,进行字符逐个比较,直到发现不匹配为止。如果 s1 小于 s2 ,返回负值, 如果 s1 大于 s2,返回正值, 如果相等,返回0.
5. 长度受限的字符串函数
char *strncpy(char *dst, char const *src, size_t len);
char *strncat(char *dst, char const *src, size_t len);
int strncmp(char const *s1, char const *s2, size_t len);
和 strcpy 一样,strncpy 用于复制(字符串必须以 NUL 字节结尾,避免出错),然而,它总是正好向 dst 写入 len 个字符,若 src 长度小于 len,
就用额外的 NUL 字节填充到 len 长度。 若 src的值大于或等于 len,只有len个字符被复制到 dst 中,它的结果将不会以 NUL 字节结尾。
strncat 函数 从 src中最多复制 len 个字符到目标数组后面,但是其总是在结果字符串后面添加一个 NUL 字节,而且不会像 strncpy 那样进行填充。
注意 strncat 函数目标数组原先的字符串并没有算在 strncat 的长度 len 中。函数最多复制 len 个字符再加一个NUL,并不管空间是否足够。
strncmp 最多比较 len 个字节,规则不变。
6.字符串查找
a.查找一个字符
char *strchr(char const *str, int ch);
char *strrchr(char const *str, int ch);
strchr 返回 字符串 str 中 字符 ch 第一次出现的位置
strrchr 返回 字符串 str 中 字符 ch 最后一次出现的位置
查找的字符不存在于字符串中,则两函数都返回NULL指针
b. 查找任何几个字符
char *strpbrk(char const *str, char const *group);
函数返回 str 中第一个匹配 group 中任何一个字符的位置,若未匹配到,返回NULL指针。如:
char *ans;
char string[20] = "Hello there, honey.";
ans = strpbrk(string, "aeiou");
ans 指向 string + 1
c. 查找一个子串
char *strstr(char const *s1, char const *s2);
函数在 s1 中查找整个 s2 第一次出现的起始位置,返回这个位置,若 s2 并没有完整的出现在 s1 中,返回NULL指针。若 s2 是空字符串,返回 s1。
d. 查找一个字符串前缀
strspn 和 strcspn 函数用于在字符串的起始位置对字符计数。
size_t strspn(char const *str, char const *group);
size_t strcspn(char const *str, char const *group);
group 字符串指定一个或多个字符,strspn 返回 str 起始部分匹配 group 中任意字符的字符数,strcspn与其相反, 它返回 不与 group 中任何字符匹配的字符数。
如:
int len1, len2;
char buffer[] = "25,142,330,Smith,J,239-4123";
len1 = strspn(buffer, "0123456789");
len2 = strspn(buffer, ",0123456789");
len1 为 2(25)
len2为 11(25,142,330,)
e. 查找标记
char *strtok(char *str, char const *sep);
strtok函数从字符串中隔离各个单独的称为标记的部分,并丢弃分隔符。此函数会修改它所处理的字符串。
sep字符串定义了用作分隔符的字符集合,str 字符串包含任意个由 sep 中一个或多个分隔符分隔的标记
例如:strtok("abc,def,ghi",","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。
在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
f.错误信息
char *strerror(int error_number);
g.字符操作
标准库包含了两组函数,用于操作单独的字符,位于头文件 ctype.h
字符分类:
函数 | 如果它的参数符合下列条件就返回真 |
iscntrl | 任何控制字符 |
isspace | 空白字符:空格' ',换页'\f',换行'\n',回车'\r',制表符'\t'或垂直制表符'\v' |
isdigit | 十进制数字0-9 |
isxdigit | 十六进制数字 |
islower | 小写字母 |
isupper | 大写字母 |
isalpha | 所有字母 |
isalnum | 字母或数字 |
ispunct | 标点符号,任何不属于数字或字母的图形字符(可打印符号) |
isgraph | 任何图形符号 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
字符转换:
int tolower(int ch); //把大写字母转换为小写字母
int toupper(int ch); //把小写字母转换为大写字母
若其参数不是处于适当大小写状态的字符,将不做处理并直接返回。
h. 内存操作
下列函数能够处理任意的字节序列
void *memcpy(void *dst, void const *src, size_t length);//复制,源和目标内存不能重叠
void *memmove(void *dst, void const *src, size_t length);//复制,源和目标内存可重叠
void *memcmp(void const *a, void const *b, size_t length);//比较
void *memchr(void const *a, int ch, size_t length);//查找字符ch在a中第一次出现的位置,共查找length个字节
void *memset(void *a, int ch, size_t length);//把a开始的length个字节都设置为字符值ch
他们与 strn开头的函数不同之处就是在遇到 NUL 字节时并不会停止操作