字符数组,字符串的操作

实现字符操作函数

小菜,字符类型记录
字符串常量 ,字符数组以\0结尾。重点两者有一定区别,\0结尾的特点很重要。

#include <stdio.h>

int foundchar(char *str,int *num,int *big,int *small);

int main(void)
{
	int num=0;//用来存储数字字符
	int big=0;//用来存放大写字符
	int small=0;//存放小写字符
	int qt=0;//存放其他类型的字符
	
	char *str1="This program from a COOL BOY!!!@@&&1234567";//这是字串常量的定义,后续操作要注意
	char str2[]={"This test."}; //这是字符数组的定义,通过目测双引号中的内容(包括空格)有10个元素
	
	printf("char型数据的字节大小:%d\n",sizeof(char));
	printf("字符数组str2的大小:%d\n",sizeof(str2));
	printf("str2的元素个数:%d\n",sizeof(str2)/sizeof(char));//这才是计算数组元素的正确方式,结果是11个,因为有一个看不到的\0;
	printf("字符常量的大小:%d\n",sizeof(str1));//其实是存放地址内存的大小。
	
	qt=foundchar(str1,&num,&big,&small);
	printf("qt=%d\nnum=%d\nbig=%d\nsmall=%d\n",qt,num,big,small);
	return 0;
}

int foundchar(char *str,int *num,int *big,int *small)
{
	int qt=0;
	if(str==NULL)return 0;//如果传过来的数组首地址为空,直接结束。
	while(*str!='\0')
	{
		if(*str>'0' && *str<'9')(*num)++;
		else if(*str>'A' && *str<'Z')(*big)++;
		else if(*str>'a' && *str<'z')(*small)++;
		else qt++;
		str++;//让地址偏移实现字串的循环。
	}
	return qt-1;//减去那个\0;
}

组合拳:自己实现字符串的API

#include <stdio.h>
#include <stdlib.h>//malloc 和 free 用到了这个头文件

void mygets(char *str);//字串获取
void myputs(char *str);//字串输出
int mystrlen(char *str);//有效字符个数记录
int mymemset(char *str,char z,int len);//字符数组初始化
void mystrcpy(char *str1,char *str2);//字符串拷贝
void mystrncpy(char *str1,char *str2,int len);//指定数量进行拷贝
void mystrcat(char *str1,char *str2);//字串拼接
int mystrcmp(char *str1,char *str2);//字串比较
void mystriwr(char *str);//大写转小写
void mystrupr(char *str);//小写转大写

int main(void)
{
	char str1[30]={"This is test."};;
	char *str2=(char*)malloc(sizeof(char)*30);
	
	myputs(str1);
	mymemset(str1,0,mystrlen(str1));
	myputs(str1);

	mygets(str1);
	mystrupr(str1);
	mygets(str2);
	mystriwr(str2);
	myputs(str1);
	myputs(str2);
	
	if(mystrcmp(str1,str2))mystrcat(str1,str2);
	else mystrcpy(str1,str2);
	myputs(str1);
	myputs(str2);
	
	free(str2);
	return 0;
}

void mygets(char *str)
{
	if(str==NULL)return;
	while(*str=getchar())
	{
		if(*str=='\n')break;
		else str++;
	}
	*str='\0';
}

void myputs(char *str)
{
	if(str==NULL)return;
	while(*str!='\0')
	{
		putchar(*str++);
	}
	putchar('\n');
}

int mystrlen(char *str)
{
	int cnt=0;
	if(str==NULL)return 0;
	while(*str!='\0')
	{
		str++;
		cnt++;
	}
	return cnt;
}

int mymemset(char *str,char z,int len)
{
	if(str==NULL)return 0;
	while(*str!='\0' && len>0)
	{
		*str=z;
		str++;
		len--;
	}
	return 1;
}

void mystrcpy(char *str1,char *str2)
{
	if(str1==NULL || str2==NULL)return;
	while(*str2!='\0')
	{
		*str1++ = *str2++;
	}
	*str1='\0';
}

void mystrncpy(char *str1,char *str2,int len)
{
	if(str1==NULL || str2==NULL)return;
	while(*str2!='\0' && len>0)
	{
		*str1++ = *str2++;
		len++;
	}
	*str1='\0';
}

void mystrcat(char *str1,char *str2)
{
	if(str1==NULL || str2==NULL)return;
	while(*str1!='\0')str1++;
	while(*str2!='\0')*str1++ =*str2++;
	*str1='\0'; 
}

int mystrcmp(char *a,char *b)
{
	if(a==NULL || b==NULL)return 1;
	while(*a !='\0'&&*b!='\0'&& *a==*b)
    {
    	a++;
        b++;
    }
    if(*a!='\0'&&*b=='\0')return 1;
    else if(*a=='\0'&&*b!='\0')return -1;
    else if(*a>*b)return 1;
    else if(*a<*b)return -1;
    else return 0;
}

void mystriwr(char *str)
{
	if(str==NULL)return;
	while(*str!='\0')
	{
		if(*str>'A' && *str<'Z')*str+=32;
		str++;
	}
}

void mystrupr(char *str)
{
	if(str==NULL)return;
	while(*str!='\0')
	{
		if(*str>'a' && *str<'z')*str-=32;
		str++;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值