strncpy函数的使用
strncpy函数的功能与strcpy函数一样——拷贝字符串。但它们区别是:strcpy
函数是把字符串全部拷贝完,而strncpy
函数能限制拷贝的字符串的数目。它的函数结构如下:
// char * strncpy ( char * destination, const char * source, size_t num );
// size_t num ---->限制要拷贝的字符串的个数。
进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "cdef";
char arr2[30] = "abc";
printf("%s\n", strncpy(arr2,arr1, 2)); //拷贝两个字符
return 0;
}
结果运行图:
它的注意事项与strcpy是一样的。我们多讲一个它的注意事项:当拷贝源的元素个数小于要拷贝的个数时,它就会在其后面补' \0',
以凑齐要拷贝的元素个数。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "cde";
char arr2[30] = "abcxxxxxx";
printf("%s\n", strncpy(arr2,arr1, 5));
return 0;
}
结果运行图:
来看一下调试图:
strncpy
函数拷贝完字符串后,不会把' \0'
拷贝过去。因为指定拷贝多少元素就拷贝多少元素(不像strcpy函数那样全部拷贝完)。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "cde";
char arr2[30] = "xxxxxx";
printf("%s\n", strncpy(arr2,arr1, 2));
return 0;
}
结果运行图:
结果调试图:
strncat函数的使用
strncat函数的功能和strcat函数的功能一样。它们的区别就是追加的元素个数可以限制。如函数结构图所示:
// char * strncat ( char * destination, const char * source, size_t num );
进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "cde";
char arr2[30] = "xxxx";
printf("%s\n", strncat(arr2, arr1, 2));
return 0;
}
结果运行图:
strncat
函数会在所拷贝的字符串后面补' \0'(
占有别人的东西,最后要还的),进行代码更改:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "cde";
char arr2[30] = "x\0xxxx";
printf("%s\n", strncat(arr2, arr1, 2));
return 0;
}
结果运行图:
调试结果图:
当拷贝源的元素个数小于要拷贝的元素个数时,它不会像strncpy
那样给你在后面补’ \0’以至补齐。小于要拷贝的元素的个数时,你有多少元素就拷贝多少元素。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "cde";
char arr2[30] = "x\0xxxx";
printf("%s\n", strncat(arr2, arr1, 4)); // 超过拷贝源的元素个数
return 0;
}
结果运行图:
结果调试图:
strncmp函数的使用
strncmp函数的功能和strcmp函数一样,它们的区别就是可以限制比较的元素个数。如函数结构图所示:
// int strncmp ( const char * str1, const char * str2, size_t num );
// 在有限的num的元素个数内,str1大于str2返回大于0的值。
// 在有限的num的元素个数内,str1=str2返回0。
// 在有限的num的元素个数内,str1小于str2返回小于0的值。
进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "xbbbcchvh";
char arr2[] = "abcdwef";
printf("%d\n", strncmp(arr1, arr2, 2));
return 0;
}
结果运行图:
strstr的使用和模拟实现
- strstr函数的结构:
// char * strstr ( const char * str1, const char * str2);
- strstr函数的功能:
strstr
函数具有寻找子集的功能,比如,str1
指向的内容是"cddef"
,str2
指向的内容是"dde"
。那么,str2
就是str1
的子集,strstr
函数就会返回str1
中找到str2
的第一个首元素的地址。所以,就会返回str1
中的第一个b
的地址。如果,没找到子集,就会返回空指针。进行代码展示:
找到的代码展示:
#include <stdio.h>
#include <assert.h>
#include <string.h>
int main()
{
char arr[] = "abbbcef";
char arr1[] = "bbc";
if (strstr(arr, arr1) == NULL)
printf("没找到\n");
else
printf("找到了\n");
return 0;
}
结果运行图:
没找到的代码展示:
#include <stdio.h>
#include <assert.h>
#include <string.h>
int main()
{
char arr[] = "abbbcef";
char arr1[] = "xbc";
if (strstr(arr, arr1) == NULL) // 返回NULL空指针
printf("没找到\n");
else
printf("找到了\n");
return 0;
}
结果运行图:
- strstr函数的模拟实现:由于原理很难用语言进行解释,所以给大家简单注释一下,进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* e1, const char* e2)
{
assert(e1 && e2); // 进行空指针断言
if (*e1 == '\0' || *e2 == '\0') //如果e1和e2都是首元素是'\0',就直接返回空指针
return NULL;
const char* str1 = e1;
const char* str2 = e2;
const char* cur = e1;
while (*cur)
{
str1 = cur;
str2 = e2;
while (*str1 && *str2 && *str1 == *str2) //用来判断是否相等的子程序块
{
str1++;
str2++;
}
if (*str2 == '\0')//判断结束,返回第一次所出现的元素地址
return cur;
cur++;
}
return NULL;
}
int main()
{
char arr[] = "abbbcef";
char arr1[] = "bbc";
printf("%s\n", my_strstr(arr, arr1));
return 0;
}
strtok函数的使用
- strtok函数的功能:能够断开有分隔符的字符串。进行代码展示:
// char arr[]="wangwenpeng@yeah.net";
// strtok会把arr里面的字符串按照分隔符来进行分割。
// 分割成三个部分
// wangwenpeng
// yeah
// net
- strtok函数的结构:进行代码展示:
// char * strtok ( char * str, const char * sep);
- strtok函数的使用注意事项:
- 1.
sep
指向的是分隔符字符串集合,我们在使用strtok
函数的时候,要创建个分隔符字符串(分隔符集合),告诉它我们有哪些分隔符,比如:char arr1[ ]=" @ ."
。由于它是个集合,所以重复的分隔符只需要写一遍就OK了。 - 2.
strtok
函数从左向右,找到第一个分隔符时,它会把这个分隔符转换成' \0'
(注:因为strtok函数会更改原有的字符串的内容,所以我们为了防止原有的数据被更改,我们一般会拷贝一份在使用),并且会记录这个分隔符的位置。它会返回这个分隔符前面字符串的首元素的地址-------->返回’ w’这个元素的地址。后面以此类推---------->找到第二个分隔符,改为’ \0’,返回第二个分隔符前面字符串的首元素的地址,即:’ y’的地址。 - 3 .第一个参数不是NULL时,它就会找到第一个分隔符,把它改为’ \0’,并记住这个分隔符的位置。(注:我们第一次使用这个函数的时候,不能给第一个参数传NULL,否则程序直接崩溃。)
- 4.第一个参数是NULL时, 它会找到上一次分隔符的位置,以此向后开始找到次位分隔符,把它改为’\0’,并且记住它的位置。(注:这种情况是在第一次使用这个函数(第一个参数不能为NULL)后,才能给第一个参数传NULL,这样后面才能进行分割。)
- 5.当你继续使用这个函数的时候(已经分割完了,你还要继续分割),它就会返回NULL。
- 1.
- strtok函数的使用:进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "wangwenpeng@yeah.net";
char arr1[40];
char fenge[] = "@.";
strcpy(arr1, arr);
char *p = NULL;
p=strtok(arr1, fenge); //第一次分割
printf("%s\n", p);
p = strtok( NULL, fenge); //第二次分割
printf("%s\n", p);
p = strtok( NULL, fenge); //第三次分割
printf("%s\n", p);
p = strtok( NULL, fenge); //分割完了,直接返回NULL
printf("%s\n", p);
return 0;
}
结果运行图:
对于strtok函数的使用,我们一般这样用,进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
char arr[] = "wangwenpeng@yeah.net";
char arr1[40];
char fenge[] = "@.";
strcpy(arr1, arr);
char* p = NULL;
for (p = strtok(arr1, fenge); p != NULL; p = strtok(NULL, fenge)) //for循环的使用
{
printf("%s\n", p);
}
return 0;
}
结果运行图:
strerror函数的使用
- strerror函数的功能:它具有显示错误信息的作用。比如:
404就是一个错误码,它表示的信息就是Not Found - 错误码的介绍:在C语言中,有一些被赋予特殊意思的数字,而每个数字的背后含义就代表每个错误信息。(假设的信息哈!!!)比如:5--------->无法打开文件。
- strerror函数的使用:使用这个函数的时候要包含头文件
<errno.h>
。里面声明了很多的错误码,里面还声明了一个全局变量errno
。每个库函数和整体的程序里面都有对应的错误码,当库函数或程序无法正常使用时,就会把错误码传给errno
这个变量,然后再打印出错误信息,也就是说errno
这个变量就是专门接收错误码的变量。 - strerror函数的结构:
// char* strerror ( int errnum );
这个函数会返回错误信息的首元素的地址。
- 进行代码展示【1】:
// 咱们把1~10的错误码信息给打印出来。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
int i = 0;
for (i = 0; i < 11; i++)
{
printf("%d:%s\n",i,strerror(i));
}
return 0;
}
结果运行图:
库函数和程序正常运行的时候就会返回数字0,表示没有错误,正常运行。
- 进行代码展示【2】:
// 我们用着fopen这个库函数打开.txt的文件,正常的话就直接打开,异常的话就会返回错误信息。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
//fopen是用来打开文件的库函数,它的返回值类型为FILE*
FILE* p = fopen("test.txt", "r");
if (p == NULL) // 无法打开时就会返回NULL
{
printf("文件打开失败,原因是:%s\n", strerror(errno));
return 1;
}
else
printf("打开成功");
return 0;
}
结果运行图:
彩蛋时刻!!!
https://www.bilibili.com/video/BV1qU4y1F73A/?spm_id_from=333.337.search-card.all.click&vd_source=7d0d6d43e38f977d947fffdf92c1dfad
每章一句:认真生活的人是最棒的。
感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期见!!!