字符串处理的库函数介绍
- 要查看完整的函数请阅读cppreference帮助文档,笔记中的重点在于介绍使用的细节、帮助文档中未详细介绍的用法、使用实例等
- 本篇内容介绍的库函数,头文件包含
<string.h>至于详细介绍,请参阅cppreference帮助文档
获取字符串长度(strlen)
- 函数原型:
size_t strlen( const char *str ); - 功能:返回字符串 str 的长度(不包括终止空字符 ‘\0’)
- 注意事项:
- str 必须是指向以 ‘\0’ 结尾的字符串的有效指针
- 如果 str 为空指针,则行为未定义
- 返回类型 size_t 是无符号整数类型,在比较时需注意避免意外的符号问题s
字符串拷贝(strcpy、strncpy)
- strcpy
- 函数原型:
char *strcpy(char *dest, const char *src); - 功能:将 src 所指向的字符串(包括空字符 ‘\0’)复制到 dest 所指向的数组中
- 注意事项:
- 目标数组 dest 必须足够大,以容纳源字符串的内容,包括终止空字符
- 如果 dest 和 src 所指向的内存区域重叠,则行为未定义
- 使用 strcpy 时需确保 dest 有足够空间,否则可能导致缓冲区溢出。更安全的替代函数包括 strncpy、snprintf 或 strcpy_s(如果支持)s
- 函数原型:
- strncpy
- 函数原型:
char *strncpy( char *dest, const char *src, size_t count ); - 功能:将 src 所指向的字符串(包括空字符 ‘\0’),复制count个字符到 dest 所指向的数组中
- 注意事项:
- 只拷贝指定个数的字符,所以可能不包含’\0’
- 如果source字符串长度小于count,则在destination字符串后追加0,直到count个
- 函数原型:
字符串拼接(strcat、strncat)
strcat
- 函数原型:
char *strcat(char *dest, const char *src); - 功能:将 src 所指向的字符串(包括终止空字符 ‘\0’)追加到 dest 所指向的字符串的末尾。 dest 中的原始终止空字符会被 src 的第一个字符覆盖,字符串以新的终止空字符结束
- 注意事项:
- 目标数组 dest 必须足够大,以容纳其原始内容和 src 的内容,包括终止空字符
- 如果 dest 和 src 所指向的内存区域重叠,则行为未定义
- 使用 strcat 时需确保 dest 有足够空间,否则可能导致缓冲区溢出。更安全的替代函数包括 strncat、snprintf 或 strcat_s(如果支持)
注:strcat常见错误如下
char arr1[] = "hello"; char arr2[] = "word"; strcat(arr1, arr2); printf("%s\n", arr1);
分析:
- 在使用strcat()函数时,dest指向的字符串要有足够的空间
- 在追加时,是在\0处追加,而不是在字符串末尾
- 源字符串必须以‘\0’结束
- 目标空间必须可修改
- 字符串自己给自己追加?一般程序会崩溃
- 函数原型:
strncat
函数原型:
char *strncat( char *dest, const char *src, size_t count );功能:限制了追加字符个数,追加指定字符个数后在后面追加一个’\0’
库中的strncat的写法:
char *strncat(char *dest, const char *source, int count) { char *ret = dest; while (*dest++) ; dest--; while (count--) if (!(*dest++ = *source++)) return ret; *dest = 0; return ret; }
字符串比较(strcmp、strncmp)
- strcmp
- 函数原型:
int strcmp( const char *lhs, const char *rhs ); - 功能:比较两个字符串(一个个字符比较ASCLL码值),若相等则返回0
- 函数原型:
- strncmp
- 函数原型:
int strncmp( const char *lhs, const char *rhs, size_t count ); - 功能:比较两个字符串,且只比较指定字符个数
- 函数原型:
字符串查找(strstr、strtok)
strstr
函数原型:
char *strstr( const char* str, const char* substr );功能:返回指向于str中找到的子串首字符的指针,若找不到则返回空指针
库中的写法如下
char* strstr(const char* str, const char* substr) { char* cp = (char*) str; char *s1, *s2; if (!*substr) return (char*) str; while (*cp) { s1 = cp; s2 = (char*) substr; while (*s1 && *s2 && !(*s1 - *s2)) s1++, s2++; if (!*s2) return cp; cp++; } return NULL; }
注:在数据结构与算法中,KMP算法可以很好的实现这个功能
strtok
函数原型:
char *strtok( char *str, const char *delim );功能:返回指向下个记号起始的指针,若无更多记号则返回空指针
实例:
利用strtok分割IP地址
char ip[] = "192.168.1.1"; char* p = "."; char* ret = NULL; for (ret = strtok(ip, p); ret != NULL; ret = strtok(NULL, p)) { printf("%s\n", ret); }
错误信息打印(strerror)
strerror
函数原型:
char* strerror( int errnum );功能:传递错误码,返回字符指针(错误信息的地址)
使用方法
char* str = strerror(errno); // errno需要引用头文件<errno.h>,它是一个全局变量(错误码变量) // 在打开文件时,可以使用这个方法处理发生错误的情况
字符分类函数、字符转化函数
字符分类函数
函数 参数的符号满足下列条件时,返回真 iscntrl 任何控制字符 isspace 空白字符:空格、换页’、换行’‘、回车’、制表符’、垂直制表符’ isdigit 十进制数字0~9 isxdigit 十六进制数字,包含十进制数字、小写字母af、大写字母AF islower 小写字母a~z isupper 大写字母A~Z isalpha 小写字母或大写字母 isalnum 0~9数字或大小写字母 ispunct 标点符号,任何不属于数字或字母的图形字符(可打印) isgrapg 任何图形字符 isprint 任何可打印字符:含图形字符、空白字符 字符转化函数
函数 含义 int tolower(int c); 转小写字母 int toupper(int c); 转大写字母