C语言进阶【2】--字符函数和字符串函数【2】

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。
  • 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在这里插入图片描述
每章一句认真生活的人是最棒的。感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期见!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值