C-常用字符串操作函数详解
//使用字符串操作应时刻注意字符串或者数组长度!!避免溢出!!
1.
size_t strlen(char const *str); //计算字符串长度, 注意返回size_t类型的值, 即unsigned int类型, 所以strlen(str1) - strlen(str2) >= 0永远是正确的(两个unsigned int相操作不会进行强制类型转换)!
|double <- float
|long
|unsigned int
|int <- short, char
2.
char *strcpy(char *dst, char const *src); //复制一个字符串src到dst, 因为dst参数将进行修改, 所以它必须是个字符数组或者是一个指向动态分配内存的数组的指针, 不能使用字符串常量的指针; strcpy无法判断目标字符数组的长度, 所以要保证dst可以容纳src及最后的NULL, 否则存储于dst之后的内存空间也将被使用
char *strncpy(char *dst, char const *src, size_t len); //复制src的len个字符到dst, 如果strlen(src)的值小于len, 则用NULL填充到len长度
3.
char *strcat(char *dst, char const *src); //找到dst的末尾, 并把src字符串的一份拷贝添加到这个位置, 所以dst也必为数组或者一个指向动态分配内存的数组的指针!
char *strncat(char *dst, char const *src, size_t len); //与strncpy不同的是从src复制len个字符到dst后会在dst字符串后添加一个NULL字节, 而且不会像strncpy那样对目标数组用NULL字节进行填充
4.
int strcmp(char const *str1, char const *str2); //比较两个字符串大小, 如果str1 < str2就返回一个小于零的值, 如果str1 > str2就返回一个大于零的值, 如果相等就返回零, 注意大于零, 小于零并不代表值为1或-1
int strncmp(char const *str1, char const *str2, size_t len); //比较两个字符串的前n大小
5.
char *strchr(char const *str, int ch); //在字符串str中查找字符ch第1次出现的位置, 找到后返回一个指向该位置的指针, 否则返回NULL
6.
char *strrchr(char const *str, int ch); //与strchr不同的是从后往前查找第一次出现的位置
7.
char *strpbrk(char constr *str, char const *group); //查找任何一组字符第一次在字符串中出现的位置, 并返回位置的指针 如 p = strpbrk("Hello John!", "aeiou")
8.
char *strstr(char const *str1, char const *str2); //查找str2第一次在str1中出现的位置, 并返回一个该位置的指针, 否则返回NULL, 若第二个参数为空字符串, 则返回str1
//标准库中并不存在strrstr或strrpbrk函数, 但是可以自己实现
9.
size_t strspn(char const *str, char const *group); //从字符串str起始位置计算包含group字符的个数, 直到碰到不属于group的字符为止
size_t strcspn(char const *str, char const *group); //与strspn相反, c来源于求补这个概念
10.
char *strtok(char *str, char *sep); //以字符串sep切割str, 仅在第一次调用strtok()函数时使用str, 在首次调用后仅需要sep参数, 将str改为NULL即可, 因为它清楚自己在当前函数中所在的位置; strtok会修改原字符串, 在str中查找包含在sep中的字符并用'\0'来替换, 直到找遍整个字符串;
#include <stdio.h> #include <string.h> int main(void) { char str[] = "My name is John!"; printf("%s\n", strtok(str, " ")); printf("%s\n", strtok(NULL, " ")); printf("%s\n", strtok(str, " ")); printf("%s\n", str); return 0; }
执行以上代码后返回
My
name
My
My
说明strtok修改了字符串, 如果首次调用后第一个参数不用NULL, 则从头开始截取相应字符串
11.
char *strset(char *str, int c); 修改str中所有字符为c
char *strnset(char *str, int c, size_t count); 把str中的前count个字符修改为字符c
12.
以下都是VC中的, Linux中并不能使用, 只能自定义
char *strrev(char *str); //反转字符串
char *_strupr(char *str); //转换为大写
char *_strlwr(char *str); //转换为小写
13.
内存操作字符串, 与str系列函数不同的是字符串里可以含有NULL或者'\0', 但是碰到不会结束, n为字节
任何类型的指针都可以转换为void类型指针
void *memcpy(void *dst, void const *src, size_t n); //类似strcpy, 但是不会碰到'\0'就返回
void *memmove(void *dst, void const *src, size_t n); //比memcpy处理慢, 但是如果dst和src重叠的话用此函数
void *memcmp(void const *str1, void const *str2, size_t n); //比较字符串
void *memchr(void const *str, int c, size_t n); //查找单个字符
void *memset(void *str, int c,, size_t n); //设置字符串
如果要在两个整数数组间操作的话(比如memcpy)n为sizeof(src), 如果要指定个数则n * sizeof(src[0])