共计 3111 个字符,预计需要花费 8 分钟才能阅读完成。
字符操作函数
strlen() 求字符串长度
#include <string.h>
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 <string.h>
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 <string.h>
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 <string.h>
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[] = "abcde@daef.foce";
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 <string.h>
#include <errno.h>
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 <string.h>
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 的指针。
正文完