字符函数和字符串

目录

1.字符分类函数

2.字符转换函数

 3.srlen的使用和模拟

3.1使用

3.2模拟

4.strcpy的使用和模拟

4.1使用

4.2模拟

5.strcat的使用和模拟

5.1使用

5.2模拟

6.strcmp的使用和模拟

6.1使用

6.2模拟

7.strncpy函数

8.strncat函数

9.strncmp函数

10.strstr使用和模拟

11.strtok函数的使用

12. strerror函数的使用

13.perror函数


1.字符分类函数

有一系列函数是做字符分类的,放在ctype.h头文件中

举例:

int islower(int c);
islower(c);
在这里,islower是确定参数部分是否是小写字母,如果是,则返回真
不是,则返回假

2.字符转换函数

当我们想要转换大小字母,可以用以下方法
char c='A';
c+=32;
因为英文大小写的ASCLL码是相差32,所以大小写可以用32来转换


 但c语言中本身就有转换大小写的字符函数

int tolower(int c);将参数部分变成大写
int toupper(int c);将参数部分变成小写
tolower(c);
toupper(c);

 3.srlen的使用和模拟

3.1使用

size_t strlen(const char*str);
这里strlen返回的类型是size_t,也就是无符号整数类型
参数部分是字符指针
计算的是\0出现前的字符个数,字符指针指向的字符串必须以\0结束
举例:
strlen("len")-strlen("gggggg")
这里因为size_t是无符号整数,所以两者相减的结果也是无符号整数,虽然是负数,但这里也被识别为大于0

3.2模拟

模拟1
int strlen1(const char* str)//这里参数接受的字符指针,对应指针存的是字符串首字符的地址
{
	int count = 0;
	assert(str);//检查是否有问题
	while (*str)//这里之所以这么写条件,是因为当str不停的加,加的是地址,那么加到\0字符的地址的时候,\0等于0,所以while循坏会结束
	{
		count++;//每加一个地址,就计数一次,直到地址对应到了\0
		str++;
	}
	return count;
}
int strlen2(const char* str)
{
	assert(str);
	if (*str == '\0')//这里是直接判断当前指针str对应的字符是不是\0
如果是,则直接返回0
	{
		return 0;
	}
	else
	{
		return 1 + strlen2(str + 1);//这里是通过递归,只要不是\0,就+1,然后继续执行一次函数
直到遇到\0,由于\0也只会返回0,所以最后的返回的值就是字符的个数
	}
}
模拟3

int strlen3(char* s)
{
	assert(s);
	char* p = s;//将s存储的地址赋给新的字符指针p
	while (*p != '\0')//这里当*p=='\0'的时候,就不会继续执行
	{
		p++;
	}
	return p - s;//这样p对应的地址就是\0,s对应的地址是字符串首字符地址
所以相减,就是对应的字符数量
}

4.strcpy的使用和模拟

4.1使用

char*strpy(char * destination,const char*source);
字符串必须以\0结束
\0也会被拷贝到目标空间也就是destination指针指向的字符串
目标空间必须足够大,能存放source指针指向的字符串
目标空间必须可以改变

4.2模拟

char* strcpy1(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while ((*dest++ = *src++))//这里就是让源字符串的内容赋值给目标字符串
但由于这里*dest如果遇到了\0之后,也就是结尾符会停止循环
	{
		;
	}
	return ret;
}

5.strcat的使用和模拟

5.1使用

char*strcat(char * destination,const char*source);
字符串以\0结束
目标字符串必须有\0
目标空间必须足够大,且可以改变
如果自己给自己追加,会死循环

5.2模拟

char* strcat1(char* dest, char* src)
{
	char* ret = dest;用来返回内容
	assert(dest != NULL);简单的报错
	assert(src != NULL);
	while (*dest)//先进行while,让dest指针指向字符串的结尾符
	{
		dest++;
	}
	while (*dest++ = *src++);//从结尾符开始,将源字符串的内容赋值进去,直到把原字符串的\0也赋值进去,然后while就会判断*dest是\0,则循坏结束
	return ret;
}

6.strcmp的使用和模拟

6.1使用

int strcmp ( const char * str1, const char * str2 );
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

6.2模拟

int strcmp1(const char* str1, const char* str2)
{
	int ret = 0;
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)//如果对应位置的两个字符相等,则继续执行循坏
	{
		if (*str1 == '\0')如果字符等于\0,说明到了结尾,且一直想等,所以直接返回0
		{
			return 0;
		}
		str1++;让str1不停的增长,下同理
		str2++;
	}
	return *str1 - *str2;假如不相等,那么就用ASCLL码进行判断,直接字符相减,从而返回大于0或小于0的值

}

7.strncpy函数

char *strncpy(char *destination,const char*source,size_t num);
拷贝num个字符从原字符串到目标空间
如果源字符串长度小于num(包含\0),则拷贝完字符串后,在目标字符串后面继续增加0,直到num个

8.strncat函数

char *strncat(char *dest, const char *src, size_t n)
将src的前n个字符追加到目标dest里,最后再加一个\0
如果源中的字符串长度小于n,则只有\0之前的内容,当然\0也会追加过去,为了保证字符串合法。
但是不会在\0前加0从而填补空缺.

9.strncmp函数

int strncmp(const char *str1,const char*str2.size_t num);
比较str1和str2的前num个字符,如果相等继续往后比较,最多比较num个字母,如果提前发现不一样,就提前结束,根据ASCLL码比较大小,如果直到num个字符都相等,那就返回0

10.strstr使用和模拟

 10.1使用

char * strstr(const char*,const char*);
找到第一个字符串中出现第二个字符串的位置,返回这个位置的地址,类型是char *
如果没找到,返回空指针
查找的时候不包含\0,但遇到\0就结束了
#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] ="This is a simple string";
 char * pch;
 pch = strstr (str,"simple");//两者类型都是char *,所以可以直接赋值
 strncpy (pch,"sample",6);//这样就会输出跟最开始一模一样的字符串
 printf("%s\n", str);
 return 0;
}

10.2模拟

char* strstr1(const char* str1, const char* str2)
{
	char* cp = (char*)str1;
//将第一个字符串的地址给予cp指针
	char* s1, * s2;//待会要用
	if (!*str2)
//如果str2这个指针指向的是\0,通过!变成真,满足条件,直接返回第一个字符串的指针
	{
		return ((char*)str1);
	}
	while (*cp)//直到cp指针指向\0前
	{
		s1 = cp;
//假设cp是第一个字符串中相等的位置,s1是用来下面增长的,否则不好返回
		s2 = (char*)str2;
//s2是用来简化代码长度的
		while (*s1 && *s2 && !(*s1 - *s2))
//假如两个字符相等,那么会满足while循坏条件,直到不相等
		{
			s1++; s2++;
		}
		if (!*s2)
//如果上面的循坏结束后,*s2变成了\0,说明找到了,
//这里加!,让\0变成真,从而执行下面的语句
		{
			return (cp);
//因为找到了,所以直接把cp的地址传递回去,这里cp就是第一个相等的地址
		}
		cp++;
//假如上面的if条件没有达成,说明cp指向的不是相等,
//或者说第二个字符串的一部分跟第一个字符串相等,
//所以还得继续加cp,直到能执行if语句,或者cp指向了\0
	}
	return(NULL);//如果cp循坏到了\0,说明第二个字符串在第一个字符串里没有找到,
//所以直接返回空指针
}

11.strtok函数的使用

char * strtok(char *str,const char*sep);
sep是指向一个字符串,定义了用作分隔符的字符集合

第一个参数指定一个字符串,它包含了0个或者多个sep字符串中一个或者多个分隔符
分割的标记

就是一个sep字符串中可能不是一个字符,有多个字符,
函数只要在str看到其中一个字符,就会认为是一个标记。

strtok会找到标记,然后将标记也就是str字符串中sep字符串的内容变成\0,
并将\0前的内容的首字符的指针返回

由于strtok函数会将标记改成\0,所以str字符串需要可改变
strtok函数的str字符串如果是非NULL,会找到str中的第一个标记,且保存它的位置
如果是NULL,则在这个位置的基础上继续找标记,保存位置,修改,
如果还有一条strtok语句,则会继续查找这个位置之后的标记
如果找不到了,就会返回一个空指针,即NULL

#include<stdio.h>
#include<string.h>

int main()
{
	char arr[] = "192.168.6.1";
	char* sep = ".";
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
    初始先给第一个参数,记录第一个位置,后面可以用NULL作参数,
从而不停的找后面的标记
	{
		printf("%s\n", str);
	}
	return 0;
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

12. strerror函数的使用

char * strerror(int errnum);
打印错误信息。不同系统和c语言标准库的实现中都规定了一些错误码,
放在errno.h头文件中,当c语言程序启动,
则会使用一个errno的全局变量来记录当前程序的错误码,
默认是0,没有错误,当出现错误之后,会改变,
但因为是整数,不知道是什么意思,所以可以用这个函数来将整数对应的错误信息的字符串地址返回

#include<errno.h>
#include<string.h>
#include<stdio.h>

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%s\n", strerror(i));//打印对应整数的错误信息
	}
	return 0;
}

第一个是没有错误

第二个是操作被拒绝

第3个是没有这个文件或文件夹

第4个是没有这个进程

第5个函数调用被中断了

第6个输入输出错误

第7个没有这个设备或者地址

第8个参数太多了

13.perror函数

perror("ww");
最后输出的时候,直接输出ww : error变量对应的错误信息
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值