字符操作函数
strlen()求字符串长度
#include
size_t strlen(const char *str)
- str :要计算长度的字符串的首地址。
- size_t :这是unsigned int类型,是无符号的。
- 注意 :必须读取到 \0 才算结束,但是返回的长度不包括结尾字符 \0。
char arr1[] = "abcd";
char arr2[] = {'a','b','c','d'};
int a = strlen(arr1); //a的值为4
int c = strlen(arr2);
//c的值无法确认,因为数组后面没有\0,所以strlen要一直计算到有 \0的地方才结束
//所以C的值可能会很大
字符串拷贝
strcpy()
#include
char *strcpy(char *dest, const char *src)
- 把 src 所指向的字符串复制到 dest。
- 该函数返回一个指向最终的目标字符串 dest 的指针(即返回dest的地址)
- 注意:源字符串 src 必须以 \0 结尾,否则程序会崩溃
- 这个函数会将源字符串中的 \0 也拷贝过去。
- 注意:目标dest空间的值必须可变,才能放下源字符串。
char* arr1 = "abcde";
char arr2[] = "qwer";
strcpy(arr1,arr2); //这种用法是错误的,程序会崩溃
// 因为arr1 是常量字符串,是不可更改的,所以会崩溃。
strncpy()
char *strncpy(char *dest, const char *src, size_t n)
- n :指定要从 src 中拷贝的字符个数。
- 当源字符串 src 中没有 n 个字符时,任然会拷贝 n 个字符(剩余的用 '\0' 填充)
字符串追加
strcat()
#include
char *strcat(char *dest, const char *src)
- 作用:将src中的字符串追加到 dest 字符串后面。
- dest :指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
- src :指向要追加的字符串,该字符串不会覆盖目标字符串。
- 返回值:返回一个指针,指向dest。
- 这种方法追加字符串,可以追加自己。
注意:
- 源字符串 src和dest 都必须要有 '\0' 。
- 追加时,在dest 的 '\0' 处开始追加,直到src的 '\0' 追加完后结束(把 '\0' 也追加过去)
- dest 空间内的值必须是可变的,不能是常量。
strncat()
char *strncat(char *dest, const char *src, size_t n)
- n :要追加的最大字符数。
字符串比较
strcmp()
int strcmp(const char *str1, const char *str2)
- 作用: 把 str1 所指向的字符串和 str2 所指向的字符串进行比较(比较对应字符的ASCII码)
- 注意:这个不是比较字符串长度,是比较对应位置上的字符大小,如果相同就比较下一对,直到 '\0' 为止。如果不相同,则返回比较结果。
返回值:
- 返回值小于 0,则表示 str1 小于 str2。
- 返回值大于 0,则表示 str1 大于 str2。
- 返回值等于 0,则表示 str1 等于 str2。
strncmp()
int strncmp(const char *str1, const char *str2, size_t n)
- n :指定要比较的最大字符数(比较前 n 个字符)
strstr()检索字符串的位置
#include
char *strstr(const char *bigChar, const char *litterChar)
- 函数作用:在大字符串中搜索小字符串第一次出现的位置。
- bigChar : 大字符串。
- litterChar :小字符串。
- 返回值 :返回在 bigChar 中第一次出现 litterChar 字符串的位置,如果未找到则返回 null。
strtok()字符串分解
char *strtok(char *str, const char *delim)
- 作用 :分解字符串 str 为一组字符串,delim 为分隔符。
- str :字符串
delim :分隔符
- 分隔符为字符串时,字符串中每个字符都是一个分隔符
- 这个函数会将 str 字符串中与分隔符相同的字符,变为 '\0'。
- 返回值:返回被分解的第一个子字符串,如果没有分割,则返回一个空指针。
- 注意:当 str 为NULL时,会从上次标记的位置开始找。
int main()
{
char arr[] = "[email protected]";
char buf[30] = { 0 };
strcpy(buf, arr);
const char* sep = "@.";
printf("%s\n", strtok(buf, sep)); //从buf地址开始找
printf("%s\n", strtok(NULL, sep)); //从上次标记的位置往后开始找
printf("%s\n", strtok(NULL, sep));
return 0;
}
输出结果:
abcde
daef
foce
strerror()根据错误码返回错误信息
#include
#include
char *strerror(int errnum)
- 作用 :从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。
- errnum : 错误号码,一般是errno(程序出错时,编译器会将错误码存放到errno中)
- 注意 :strerror 生成的错误字符串取决于开发平台和编译器。
printf("%s\n",strerror(errno)); //打印错误信息。
perror()打印错误信息
void perror(const char *str) //直接将错误信息打印出来,而strerror只是找到错误信息位置
- str : 这是字符串,是一个自定义消息,将显示在原本的错误消息之前。
字符转换函数
tolower()转换为小写字母
int tolower(int c);
- c :要被转换为小写的字母。
- 返回值:如果 c 有相对应的小写字母,则返回 c 的小写字母,否则 c 保持不变
- 返回值是一个可被隐式转换为 char 类型的 int 值。
toupper()转换为大写字母
int toupper(int c);
内存操作函数
memcpy()内存拷贝
#include
void *memcpy(void *str1, const void *str2, size_t n)
- 函数作用 : 从存储区 str2 复制 n 个字节到存储区 str1。
- 注意 :这个函数的拷贝是针对内存的,无论内存中的数据是什么类型。
memmove()重叠内存拷贝
void *memmove(void *str1, const void *str2, size_t n)
函数功能:可以实现跟 memcpy 相同的功能,并且可以进行重叠内存的拷贝。
- 如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。
- 在VS编译器中,memcpy也能实现重叠内存拷贝。
memcmp()内存比较
int memcmp(const void *str1, const void *str2, size_t n)
- 函数功能 :把存储区 str1 和存储区 str2 的前 n 个字节进行比较
- n : 要比较的字节数。
返回值 :
- 返回值 < 0,则表示 str1 小于 str2
- 返回值 > 0,则表示 str1 大于 str2
- 返回值 = 0,则表示 str1 等于 str2
- 注意:这个内存比较是不会在意是否存在 '\0' 的。
memset()内存填充
void *memset(void *str, int c, size_t n)
- 函数作用 :将字符串 str 的前 n 个字符全部填充为字符 c(一个字符就是一个字节,所以它是以字节为单位进行填充的)
- 返回值 :返回一个指向存储区 str 的指针。