前言
2020年6月毕业,实习期间,在我第一次接触公司的业务代码之后,我感觉自己之前学了假的C语言,那种C语言仅仅停留在,switch,case,if,else循环以及一些简单的结构体的应用,
到了公司,学校学习的代码,连最简单的业务代码看起来都是超级的费劲,带我的老师,推荐我学习C菜鸟教程,进行C语言的强化。这些框架是来在C菜鸟教程。
附上菜鸟教程的连接: link. C菜鸟教程,点击link即可跳转。
"我是分割线"********"我是分割线"********"我是分割线"********"我是分割线"********"我是分割线"
"我是分割线"********"我是分割线"********"我是分割线"********"我是分割线"********"我是分割线"
简介
<string.h>库: string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
库变量
下面是头文件 string.h 中定义的变量类型:
size_t
这是无符号整数类型,它是 sizeof 关键字的结果
库宏
下面是头文件 string.h 中定义的宏:
NULL
这个宏是一个空指针常量的值。
库函数
下面是头文件 String.h 中定义的22个函数
1. void *memchr(const void *str, int c, size_t n);
2. int memcmp(const void *str1, const void *str2, size_t n);
3. void *memcpy(void *dest, const void *src, size_t n);
4. void *memmove(void *dest, const void *src, size_t n);
5. void *memset(void *str, int c, size_t n)
6. char *strcat(char *dest, const char *src)
7. char *strncat(char *dest, const char *src, size_t n)
8. char *strchr(const char *str, int c)
9. int strcmp(const char *str1, const char *str2)
10. int strncmp(const char *str1, const char *str2, size_t n)
11. int strcoll(const char *str1, const char *str2)
12. char *strcpy(char *dest, const char *src)
13. char *strncpy(char *dest, const char *src, size_t n)
14. size_t strcspn(const char *str1, const char *str2)
15. char *strerror(int errnum)
16. size_t strlen(const char *str)
17. char *strpbrk(const char *str1, const char *str2)
18. char *strrchr(const char *str, int c)
19. size_t strspn(const char *str1, const char *str2)
20. char *strstr(const char *haystack, const char *needle)
21. char *strtok(char *str, const char *delim)
22. size_t strxfrm(char *dest, const char *src, size_t n)
1.void *memchr(const void *str, int c, size_t n)
在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
2 int memcmp(const void *str1, const void *str2, size_t n)
把 str1 和 str2 的前 n 个字节进行比较。
3 void *memcpy(void *dest, const void *src, size_t n)
从 src 复制 n 个字符到 dest。
4 void *memmove(void *dest, const void *src, size_t n)
另一个用于从 src 复制 n 个字符到 dest 的函数。
5 void *memset(void *str, int c, size_t n)
复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
6 char *strcat(char *dest, const char *src)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
7 char *strncat(char *dest, const char *src, size_t n)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
8 char *strchr(const char *str, int c)
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
9 int strcmp(const char *str1, const char *str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
10 int strncmp(const char *str1, const char *str2, size_t n)
把 str1 和 str2 进行比较,最多比较前 n 个字节。
11 int strcoll(const char *str1, const char *str2)
把 str1 和 str2 进行比较,结果取决于 LC_COLLATE 的位置设置。
12 char *strcpy(char *dest, const char *src)
把 src 所指向的字符串复制到 dest。
13 char *strncpy(char *dest, const char *src, size_t n)
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
14 size_t strcspn(const char *str1, const char *str2)
检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。
15 char *strerror(int errnum)
从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。
16 size_t strlen(const char *str)
计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
17 char *strpbrk(const char *str1, const char *str2)
检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置。
18 char *strrchr(const char *str, int c)
在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
19 size_t strspn(const char *str1, const char *str2)
检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。
20 char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
21 char *strtok(char *str, const char *delim)
分解字符串 str 为一组字符串,delim 为分隔符。
22 size_t strxfrm(char *dest, const char *src, size_t n)
根据程序当前的区域选项中的 LC_COLLATE 来转换字符串 src 的前 n 个字符,并把它们放置在字符串 dest 中
"我是分割线"********"我是分割线"********"我是分割线"********"我是分割线"********"我是分割线"
"我是分割线"********"我是分割线"********"我是分割线"********"我是分割线"********"我是分割线"
1.void*memchr()
声明
下面是 memchr() 函数的声明。
void *memchr(const void *str, int c, size_t n)
函数描述:
在参数 str 所指向的字符串的 前 n 个 字节中,搜索第一次出现字符 c(一个无符号字符)的位置。
参数:
- str–>指向要执行搜索的内存块
- c --> 以int形式传值,函数在搜索时,使用的是该值的无符号字符形式
- n–>要被分析的字节数
返回值:
该函数返回一个指向匹配字节的指针.
如果在给定的内存区域未出现字符,则返回 NULL.
实例
int main()
{
const char str[] = "Beijing_龙田华远.陈旭.加油 chenxu 2020-5-20 !";
const char ch1 = '.';
const char ch2 = 'c';
char *ret;
ret = (char*)memchr(str, ch1, strlen(str));
printf("%c 之后的字符串是--> %s \n", ch1, ret);
ret = (char*)memchr(str, ch2, strlen(str));
printf("%c 之后的字符串是--> %s \n", ch2, ret);
return(0);
}
输出的结果为:
. 之后的字符串是--> .陈旭.加油 chenxu 2020-5-20 !
c 之后的字符串是--> chenxu 2020-5-20 !
memchr的实现:
void *memchr(const void *buf, int c, unsigned int count)
{
assert(buf != NULL);
while (count --)
{
if (*(char *) buf == c)
return (void *) buf;
buf = (char *) buf + 1;
}
return NULL;
}
小结:相当于把指针,指向了字符串的首次出现对比字符的位置。
2.int memcmp()
声明
下面是 memcmp() 函数的声明。
void *memchr(const void *str, int c, size_t n)
函数描述:把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
参数
str1 – 指向内存块的指针。
str2 – 指向内存块的指针。
n – 要被比较的字节数。
返回值
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。
3.void *memcpy()
声明
下面是 memcpy() 函数的声明。
void *memcpy(void *str1, const void *str2, size_t n)
描述
C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
参数
str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
4.void *memmove()
声明
下面是 memmove() 函数的声明。
void *memmove(void *str1, const void *str2, size_t n)
描述
从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
参数
str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
5.void *memset()
描述
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
声明
下面是 memset() 函数的声明。
void *memset(void *str, int c, size_t n)
参数
str – 指向要填充的内存块。
c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n – 要被设置为该值的字节数。
返回值
该值返回一个指向 存储区 str 的指针。
实例
下面的实例演示了 memset() 函数的用法。
#include <stdio.h>
#include <string.h>
int main ()
{
char str[50];
strcpy(str,"This is string.h library function");
puts(str);
memset(str,'$',7);
puts(str);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
This is string.h library function
$$$$$$$ string.h library function
6.char* strcat()
7.char *strncat()
8.char *strchr()
9.int strcmp()
10.int strncmp()
11.int strcoll()
12.char *strcpy()
13.char *strncpy()
14.size_t strcspn()
15. char *strerror()
C 库函数 - strerror()
C 标准库 - <string.h> C 标准库 - <string.h>
描述
C 库函数 char *strerror(int errnum) 从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。strerror 生成的错误字符串取决于开发平台和编译器。
声明
下面是 strerror() 函数的声明。
char *strerror(int errnum)
参数
errnum – 错误号,通常是 errno。
返回值
该函数返回一个指向错误字符串的指针,该错误字符串描述了错误 errnum。
实例
下面的实例演示了 strerror() 函数的用法。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE *fp;
fp = fopen(“file.txt”,“r”);
if( fp == NULL )
{
printf(“Error: %s\n”, strerror(errno));
}
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果,因为我们尝试打开一个不存在的文件:
Error: No such file or directory