字符,字符串的函数(C语言)

目录

1)字符分类函数

2)字符转换函数

3)字符串函数

1>.strlen

1>.strlen的模拟实现

2>.strcpy

2>.strcpy的模拟实现

3>.strcat

3>.strcat的模拟实现

4>.strcmp

4>.strcmp的模拟实现

5>.strnpy

5>.strncpy的模拟实现

6>.strncat

6>.strncat的模拟实现

7>.strncmp

7>.strncmp的模拟实现

8>.strtok

9>.strstr

9>.strstr的模拟实现

10>.strerror


1)字符分类函数

以islower举例; 

c是小写字母则返回非0的数,不是小写字母则返回0;其他函数与islower类似,在此不再继续赘述;

2)字符转换函数 

字符转换函数主要有两种,分别是tolower(大写->小写)和toupper(小写->大写),char ch=tolower('A'),使用起来较为简单;

3)字符串函数

1>.strlen

strlen函数是专门用来计算字符串长度的函数;字符串以'\0'作为结束标志,strlen返回的是在和字符串'\0'前出现的字符个数(不包含\0);注意参数指向的字符串必须有\0;函数的返回类型是size_t,就是无符号整型;头文件是<string.h>

1>.strlen的模拟实现

计时器的方式

//strlen的模拟实现
 
//计数器的方式
int main()
{
	char arr[] = "abcdefgh";
	int count = 0;
	int i = 0;

	while (arr[i])
	{
		count++;
		i++;
	}

	printf("%d" ,count);
	return 0;
}

运用指针-指针

//指针-指针
int main()
{
	char arr[] = "abcdefgh";

	char* p = arr;
	while (*p != '\0')
		p++;

	printf("%d", p - arr);
	return 0;
}

递归的方式(不创建临时变量)

//递归
int count(char* p)
{
	if (*p == '\0')
		return 0;
	else
		return count(p + 1) + 1;

}

int main()
{
	char arr[] = "abcdefgh";
	int c=count(arr);

	printf("%d", c);
	return 0;
}

2>.strcpy

strcpy函数是字符串拷贝函数;形式:char* strcpy(char* destination(目的地),const char* source(源头));

注意:源字符串必须以'\0'结尾,没有'\0'拷贝无法结束;拷贝的时候会将源字符串的'\0'进行拷贝;目标空间要足够大;目标空间要是可修改的;strcmp返回的是目标函数的起始地址;

//strcpy函数
int main()
{
	char arr[] = "abcdefgh";
	char arr2[100];

	strcpy(arr2, arr);   //将arr复制到arr2中

	printf("%s", arr2);
	return 0;
}

2>.strcpy的模拟实现

//strcpy的模拟实现
char* myself_strcpy(char* p1, char* p2)
{
	char* ch = p1;
	while ((*p2++ = *p1++))		  //先赋值,在加加,当*p是\0时自动停止
		;
	return p1;
}

int main()
{
	char arr1[] = "abcdefgh";
	char arr2[100] = { 0 };

	myself_strcpy(arr1, arr2);
	printf("%s", arr2);

	return 0;
}

3>.strcat

strcat是字符串追加函数;形式:char* strcat(char* destination,const char* source);

注意:目标空间要有\0;源字符串要有\0;目标空间足够大;目标空间可以修改;strcat不一定能实现自己追加;返回值是目标空间的起始地址;

//strcat追加函数
#include<string.h>
int main()
{
	char arr1[100] = "abcdef";
	char arr2[] = "ghijk";

	strcat(arr1, arr2);  //将arr2追加到arr1后面,并补充'\0'

	printf("%s", arr1);

	return 0;
}

3>.strcat的模拟实现


//strcat的模拟实现
char* myself_strcat(char* p1, char* p2, int num1,int num2)
{
	for (int i = 0; i < num2; i++)
		*(p1 + num1 + i) = *(p2 + i);
}

int main()
{
	char arr1[100] = "abcdef";
	char arr2[] = "ghijk";

	myself_strcat(arr1, arr2, strlen(arr1),strlen(arr2));
	printf("%s", arr1);

	return 0;
}

4>.strcmp

strcmp函数是用来比较字符串的,形式:int strcmp(const char* str1,const char* str2);

str1>str2返回>0的数;str1<str2返回<0的数;str1=str2返回0;

4>.strcmp的模拟实现

//strcmp的模拟实现
int myself_strcmp(const char* str1,const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "abcg";

	int c = myself_strcmp(arr1, arr2);
	printf("%d", c);
	return 0;
}

5>.strnpy

形式:char* strncpy(char* arr1,char* arr2,size_t num);其用法和strcpy相同只是增加了num来限制操作字符的个数;运用该函数,不一定会拷贝\0如果num大于arr2的数组个数,则多余的自动不\0。

strncpy函数与strcpy的区别是,其是长度受限制的字符串函数,就是可以限制复制字符的个数; 

5>.strncpy的模拟实现

//strncpy的模拟实现
char* myself_strncpy(char* p2, char* p1, int num)
{
	char* ch = p2;
	for (int i = 0; i < num; i++)
		*(p2 + i) = *(p1 + i);
	return p2;
}

int main()
{
	char arr1[] = "abcdefg";
	char arr2[100] = {0};
	int a = 4;

	char* ch = myself_strncpy(arr2, arr1, a);
	printf("%s", arr2);

	return 0;
}

6>.strncat

形式:char* strcat(char* destination,const char* source,int num);

6>.strncat的模拟实现

//strncat的模拟实现
char* myself_strncat(char* p1, char* p2, int num)
{
	char* ch = p1;
	while (*p1)
		p1++;
	for (int i = 0; i < num; i++)
		*(p1 + i) = *(p2 + i);
	*(p1 + 1) = '\0';
		return ch;
}

int main()
{
	char arr1[110] = "abcdef";
	char arr2[110] = "ghijkl";

	int num = 1;
	char* c = myself_strncat(arr1, arr2, num);
	printf("%s", arr1);

	return 0;
}

7>.strncmp

形式:int strcmp(const char* str1,const char* str2,num);

7>.strncmp的模拟实现

//strncmp的模拟实现
int myself_strncmp(char* p1, char* p2, int num)
{
	for (int i = 0; i < num; i++)
	{
		if (*p1 = p2)
		{
			if (*p1 == '\0')
				return 0;
			if (i == num - 1)
				return 0;
			p1++;
			p2++;
		}
	}
	return (*p1 - *p2);
}

int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "abcg";
	int num = 3;

    int  c = myself_strncmp(arr1, arr2, num);
	printf("%d", c);
	return 0;
}

8>.strtok

strtok函数是用来把一个字符串中分割符(.   @  )....)去掉的,形式:char* strtok(char* str ,const char* sep);

str指向一个字符串,他包含一个或多个有sep字符串中一个或多个分隔符分割的标志;sep指向字符串,定义用作分隔符的字符集合;

strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向标记的指针;strtok会改变被操作的字符串,所以strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改;

strtok有记忆作用,其会记住字符串中被修改的位置,当其第一个参数是NULL的时候,函数就会自动找到str上一次被修改的位置,从哪你开始查找;

9>.strstr

strstr函数是用来在一个字符串中寻找它的子字符串的;

形式:char* strstr(const char* arr1,const char* arr2)在arr1数组的字符串中找arr2字符串,并返回arr2出现的地址;

//strstr函数
#include <string.h>
int main()
{
	char arr1[] = "abcdefgh";
	char arr2[] = "df";

	char* ch = strstr(arr1, arr2);  //在arr1中找是否有子字符串arr2
	printf("%s", ch);

	return 0;
}

没找到,则返回空指针NULL;

9>.strstr的模拟实现

//strstr的模拟实现
char* myself_strstr(const char* p1,const char* p2)
{
	char* s2 =NULL ;
	char* str2 = NULL;
	const char* str =p1;

	while (*str != 0)
	{
		 s2 = p2;
		 str2 = str;
		while (*str2 == *s2&&*s2&&*str2)
		{
			str2++;
			s2++;
			if (*s2 == '\0')
				return str;
		}
		str++;
	}
	return NULL;
}

int main()
{
	char arr1[] = "abcdefgh";
	char arr2[] = "defg";

	char* ch = myself_strstr(arr1, arr2);
	printf("%s", ch);
	return 0;
}

10>.strerror

在程序中有一个全局变量errno只用来羁旅程序当前的错误码的,程序刚启动的时候errno是0,表示无错误,而当我们在使用标准库中的函数是发生某种错误,就会将相应的错误码存放在errno中,错误码是专门用来储存错误信息的,而strerror函数是将错误码对应的错误信息的字符地址返回;形式:char* strerror(int num);erron头文件是<errno.h>

与它作用显示的函数perror,他是直接将erron中的错误码的错误信息打印出来;不是通过地址来打印字符串的;就相当于printf+strerror

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半桔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值