字符串的库函数使用和实现(二)

本文介绍了C语言中带长度限制的字符串函数strncpy、strncat、strncmp,以及字符串查找函数strstr和strtok的使用方法,同时涵盖错误信息报告的strerror和perror功能。
摘要由CSDN通过智能技术生成


前言

本文将介绍有长度限制的字符串函数及字符串查找函数,报错误信息的库函数


一、带长度的字符串函数

1、strncpy函数

(1)库函数
首先看下C语言库中对该函数的定义,char *strncpy( char *strDest, const char *strSource, size_t count );
和strcpy基本上是相同的,唯一就是多加了个函数参数多了个复制的长度。该发生在重叠字符串则行为是未定义的。
那么来看看该函数的实现
其实看到这个函数大家都有个疑问,如果要传递的长度比源字符串长怎么办?看以下代码

//正常使用
#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[20] = "abcdefg";
	char arr2[] = "xxxxx";
	strncpy(arr1, arr2, 3);
	printf("%s", arr1);
	return 0;
}
//
#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[20] = "abcdefg";
	char arr2[] = "xxxxx";
	strncpy(arr1, arr2, 6); //很明显源字符串只有五个,那么是不是就会报错呢?
	printf("%s", arr1);
	return 0;
}

正常使用的情况:
在这里插入图片描述
就是会直接将源字符串的前num个元素拷贝到目标字符串
如果不够的情况:
在这里插入图片描述
如果源 C 字符串的末尾(由 null 字符表示)在复制 num 字符之前找到(当传递的个数多于源字符串长度时),destination 用零填充,直到写入总共 num 个字符。(就会用0来填充,直到写入了num个字符)

(2)实现
和之前讲的strcpy的实现方法基本相同的,要多加一个传递的字符串长度
看以下代码

#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, int num)
{
	assert(dest && src);
	char* start = dest;
	while (num--)
	{
		*dest++ = *src++;
		if (*src == '\0')
			break;
	}
	if (*src == '\0')
	{
		while (num--)
		{
			*dest++ = '\0';
		}
	}
	return start;

}
int main()
{
	char arr1[20] = "abcefg";
	char arr2[] = "xxxxx";
	int k = 0;
	scanf("%d", &k);
	printf("%s\n", my_strncpy(arr1, arr2, k));
	return 0;
}

2、strncat函数

(1)库函数
首先看下C语言中库函数的定义
char *strncat( char *strDest, const char *strSource, size_t count );
和之前(一)讲的strcat是一样的,
首先还是那个问题,就是我如果源字符串长度小于传递的字符串怎么办?
那么C语言库函数规定,如果 count 大于 strSource 的长度,则使用 strSource 的长度代替 count。生成的字符串以 null 字符结尾。
看两个代码
正常使用

#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	printf("%s\n", strncat(arr1, arr2, 3));
	return 0;
}

在这里插入图片描述
超出范围

#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	printf("%s\n", strncat(arr1, arr2, 3));
	return 0;
}

在这里插入图片描述
(2)实现

#include<stdio.h>

char* my_strncat(char* dest, char* src, int num)
{
	char* start = dest;
	while (*dest)
	{
		dest++;
	}
	while (num--)
	{
		*dest++ = *src++;
		if (*src == 0)
			break;
	}
	return start;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	int k = 0;
	scanf("%d", &k);
	printf("%s\n", my_strncat(arr1, arr2, k));
	return 0;
}

3、strncmp函数

(1)库函数
首先C语言中库函数的介绍 int strncmp( const char *string1, const char *string2, size_t count );这个就比较简单了,看使用代码

#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "abllo";
	printf("%d\n", strncmp(arr1, arr2, 2));
	return 0;
}

(2)实现

#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* dest, const char* src, int num)
{
	assert(dest && src);
	int signel = 0;
	while (num--)
	{
		if (*dest != *src)
		{
			signel = 1;
			break;
		}
		dest++;
		src++;
	}
	if (signel == 1)
	{
		if (*dest > *src)
			return 1;
		else
			return -1;
	}
	else
		return 0;
}
int main()
{
	char arr1[] = "hezlo";
	char arr2[] = "herld";
	int k = 0;
	scanf("%d", &k);
	printf("%d\n", my_strncmp(arr1, arr2, k));
	return 0;
}

二、字符串的查找

1、strstr函数

首先来看C语言中库函数的定义,char *strstr( const char *string, const char *strCharSet );
Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.
这个函数是这样使用的,strCharSet这个是要找的字符串,在string里找这个字符串,如果找到了,返回第一次出现strCharset的指针,如果没找到,就返回空指针。如果要找的字符串指向长度为0的字符串,则返回string。

1)使用
#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[] = "abcdabcdabcd";
	char arr2[] = "bcdz";
	printf("%s\n", strstr(arr1, arr2));
	return 0;
}

在这里插入图片描述
(2)实现
实际上这个代码实现需要两步,比方说我是在dest这个数组里找src这个字符串,首先需要一个遍历dest数组的指针,还需要一个记录位置的指针。第二,需要一个遍历src字符串的指针,还需要一个记录起始位置的指针,然后一个一个对比,最后返回dest记录位置的指针就好了。

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* dest, const char* src)
{
	assert(dest && src);
	if (*src == '\0')
		return (char*)dest;
	while (*dest)
	{
		char* point = (char*)dest;
		char* find = (char*)src;
		while (*point && *find && *point == *find)
		{
			point++;
			find++;
		}
		if (*find == '\0')
			return (char*)dest;
		else
			dest++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abcddcbaabcc";
	char arr2[] = "z";
	if (my_strstr(arr1, arr2) != NULL)
		printf("%s\n", my_strstr(arr1, arr2));
	else
		printf("找不到了\n");
	return 0;
}

2、strtok函数

首先来看C语言中库函数的讲解,char *strtok( char *strToken, const char *strDelimit );
All of these functions return a pointer to the next token found in strToken. They return NULL when no more tokens are found. Each call modifies strToken by substituting a NULL character for each delimiter that is encountered.
是这个意思,strtok实际上是根据strdelimit这里面的分隔符来分割这个strToken这个字符串,它每次会返回找到下一个分隔符前的指针,当找不到更多分隔符会返回NULL,下次传递NULL,就是传递上个分隔符最后的位置,看一下代码

#include<string.h>

#include<stdio.h>
int main()
{
	char arr1[] = "316373012@qq.com";
	char arr[30];
	strcpy(arr, arr1);
	char* sep = ".@";
	char* str = strtok(arr, sep);
	while (str != NULL)   //当返回值就是空指针了,说明所有的分隔符找完了
	{
		printf("%s ", str);
		str = strtok(NULL, sep);//NULL是记录之前最后一个分隔符的位置,会从这个位置往后找下一个分隔符
	}

	return 0;
}

在这里插入图片描述

三、错误信息报告

1、strerror及perror

strerror是报告上一个错误的原因,返回错误码,输出错误原因
看两个代码:

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
    FILE * pFile;
    pFile = fopen("unexist.ent", "r"); //阅读这个文件,但实际上这个文件并没有创建
    if (pFile == NULL)
        printf("error:%s", strerror(errno)); //会输出错误原因
    //errno: Last error number
    return 0;
}

在这里插入图片描述
perror使用方法更简单,看以下代码:

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
    FILE * pFile;
    pFile = fopen("unexist.ent", "r");
    if (pFile == NULL)
        perror("error");
    //errno: Last error number
    return 0;
}

在这里插入图片描述

总结

本文详细讲解了C语言库函数中带长度的字符串函数及字符串查找函数,如果喜欢,还请点上屏幕上的赞支持一下博主,本文点赞过30个,2天后更新C语言库函数中内存 操作函数。

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值