C和指针-5
字符串函数
复制字符串
char *strcpy(char *dst, char const *src);
strcpy无法判断目标字符数组的长度,必须保证有足够的空间容纳需要复制的字符。
连接字符串
char *strcat(char *dst, char const *src);
函数的返回值
上面两个函数将返回第一个参数的拷贝,就是一个指向目标字符数组的指针,通常返回值会被忽略。
字符串比较
int strcmp(char const *s1, char const *s2);
如果s1小于s2,函数将返回一个小于0的值,反之将返回一个大于0的值。
长度受限的字符串函数
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);
注意:如果strlen(src)的值大于或等于len,那么只有len个字符复制到dsr,它的结果将不会以NUL结尾!
查找字符
char *strchr(char const *str, int ch);
char *strrchr(char const *str, int ch);
注意第二个参数是整型值,但是它包含了一个字符值,strchr 在字符串 str 中查找字符 ch 第一次出现的位置,找到后函数返回一个指向该位置的指针,如果不存在,函数就返回一个 NULL 指针。 strrchr 与 strchr 基本一致,它返回的是一个指向字符串中该字符最后一次出现的位置。
查找任何几个字符
char *strpbrk(char const *str, char const *group);
这个函数返回一个指向 str 中第一个匹配 group 中任何一个字符的字符位置,如果未找到,则返回 NULL 指针。
查找一个字串
char *strstr(char const *s1, char const *s2);
这个函数返回一个指向 s1 中第一个匹配子串 s2 的字符位置,如果未找到,则返回 NULL 指针。
标准库中并不存在 strrstr 或 strrpbrk 函数。
strrstr 实现
#include <string.h>
char *my_strstr(char const *s1, char const *s2)
{
register char *last;
register char *current;
last = NULL;
if( *s2 != '\0')
{
current = strstr(s1, s2);
while( current != NULL)
{
last = current;
current = strstr(last + 1, s2);
}
}
return last;
}
查找一个字符串前缀
strspn
和strcspn
用于在字符串的起始位置对字符计数
size_t strspn(char const *str, char const *group);
size_t strcspn(char const *str, char const *group);
group 字符串指定一个或多个字符,strspn 返回 str 起始部分匹配 group 中任意字符的字符数。strcpsn 相反,返回 str 起始部分中不与 group 中任何字符匹配的字符数,比如使用\n\r\f\t\v
作为参数,则返回非空字符的计数。
查找标记
strtok
从字符串中隔离各个单独的称为标记(token)的部分,并丢弃分隔符,
char *strtok(char *str, char const *sep);
sep 参数是个字符串,定义了用作分隔符的的字符集合,第一个参数指定一个字符串,它包含零个或多个由 sep 字符串中一个或多个分隔符分隔的标记。 strtok 找到 str 的下一个标记,并将其用 NUL 结尾,然后返回一个指向这个标记的指针。
#include <string.h>
#include <stdio.h>
int main ()
{
char str[80] = "This is - an - test";
const char s[2] = "-";
char *token;
/* 获取第一个子字符串 */
token = strtok(str, s);
/* 继续获取其他的子字符串 */
while( token != NULL ) {
printf( "%s\n", token );
token = strtok(NULL, s);
}
return(0);
}
结果
This is
an
website
警告:使用 strtok 函数会修改它所处理的字符串!
警告:由于 strtok 函数保存它所处理的函数的局部状态信息(静态变量),所以不能用它同时解析两个字符串!
内存操作
由于字符串操作在遇到 NUL 时会停止,使用另外一组函数可以处理任意的字节序列。
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 lenth);
void *memchr(void const *a, int ch, size_t length);
void *memset(void *a, int ch, size_t length);