实现字符操作函数
小菜,字符类型记录
字符串常量 ,字符数组以\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++;
}
}