Mohican_3/16 C语言几个函数的实现 strcpy strcmp stncmp atoi itoa strlen strcat countnum wordnum

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<assert.h>
//出现问题:
//printf("the atoi is %d  \n",Atoi(str3));//结果不输出
//printf("the itoa is %s  \n",Itoa(str4,num)); //结果输出有问题
//printf("the strcat is %s \n", Strcat(str1,str2)); 字符串连接顺序有问题


//1 strcpy1 拷贝 for
char * Strcpy1(char * des , const char * src)
{
int i;
char *p = des;
for(i=0;src[i]!='\0';i++)
{
des[i] = src[i];
}
des[i] = '\0';
return p;
}
//2 strcpy 2  拷贝  while
// *p++; 很令人混淆。它不是 *p = *p + 1;  而是 *p = *(p+1);
char *Strcpy2(char * des, const char * src )
{
assert(*src!=NULL);
char * p = des; 
while(*des++ = *src++)
{}
return p;
}


//3 strlen 计算长度
int Strlen1(char *des)
{
assert(*des!=NULL);
int count = 0 ;
while(*des!='\0')
{
count ++;
des ++;
}
return count ;
}
// 4 strncpy1 拷贝前n个字符  for循环 


char * Strncpy1(char * des, const char *src, int n)
{
assert(*src!=NULL);
char *p = des;
int i ;
for(i=0;src[i]!='\0' && i<n;i++)
{
des[i] = src[i];
}
des[i] = '\0';
return p;
}
// 5 strncpy 拷贝前n个字符  while 循环
char * Strncpy2(char * des, const char *src, int n)
{
int i ;
assert((*src!=NULL)&&(src[i]<n));
char *p = des;
while(*des++ = *src++)
return p;
}
//6 strcat 两个字符串的连接   
char * Strcat(char * des ,const char *src)
{
assert(src!=NULL);
char *p=des;
while(* des !='\0') //把des 遍历一遍 直到遇到空格
des++;//向前进一位
while(*des++ = *src++)// 把src的字符传入 des 后面
*des= '\0';
return p;
}
//7 strcmp 比较两个字符串的大小
//8 stncmp 比较两个字符串的大小 前n位
int Scncmp( char *des , char * src,int n)
{
if(! n)
{return 0;}
while (--n && *des && *des == *src ) 
{
src++;
des++;
}
return (* des- *src);
}
//9 atio 字符类型转化为整形   isalpha
int  Atoi (const char * str)// 将字符转换成整型  防止字符前面有符号“+” "-" "\0" 所以有下面的几个if判断
{
assert (str!=NULL);
int num = 0; //后面计算而设置的一个值
int flg = 1; //flg就是设定一个符号。判断是 正数还是负数
while(*str== ' ') //如果遇到第一个字符是空格,就直接++,从下一位在进行判断  例如 "  abc"
{
str++;
}
if (*str =='-') //如果遇到的第一个字符是 负号 ,就设立一个flg,标记。 因为 -1 乘以 正数 就是负数,但是如果两个负号,就还是正数。
{
str++; // 向后继续判断
flg=-1; //设置符号标记为1
}
if(*str=='+') //如果遇到第一个是" +" 不用管, 继续向下
{
str++;
}
while(isdigit(*str))  //isdigit是c里面的一个函数,检查参数是不是十进制的字符。
{
num =( num*10) + (*str-'0');  //就是最后的返回值 。
}
return (flg*num);
}


//10 itoa 整形转化为字符型  
char *Itoa( char * str , int num ) //逆置数组  倒着来
//123 --> '123'
{
int tmp;
char *p=str;
int i=0;
while(num !='\0')
{
str[i] = num%10 + '0';
num/=10;
}
str[i]='\0';
i--;


for(int j =0;j<i;j++)
{
tmp=str[i];
str[i]=str[j];
str[j]=tmp;
}
return p ;
}
// 11 Countnum  计算字符个数
int Countnum(const char *str)
{
int count = 0; //计数器
while(*str != '\0')
{
if(isalpha (*str))  //判断是字符 就进入if语句内 
{ count ++;  //计数器加
str ++;
}
/*if(*str >= 'A' && *str <= 'Z' ||
*str >= 'a' && *str <= 'z')*/
}
return count;
}


//12 wordnum   计算单词个数  // abc  de  fg q 
int Wordnum(const char *str)   
{
int flg = 0;//空格
int count = 0;//单词个数
while(*str != '\0')
{
if(*str == ' ')  
{
flg = 0;  //如果第一个就是 “ ”  那就flg = 0
}
if(*str != ' ' && flg == 0)
{
flg = 1;  
count ++;
}
str++;
}
return count;
}


int main()
{
char str1[30] = "abcde";
char *str2 = "fghij";
char str3[5] = "123";
char str4[50];
int num = 12345;

char *str5="ab cd e qab";

//测试用例

printf("the strcpy1 is %s \n", Strcpy1(str1,str2));
printf("the strcpy2 is %s \n", Strcpy2(str1,str2));
printf("the count number is %d\n",Strlen1(str1));
printf("the strncpy1 is %s \n", Strncpy1(str1,str2,3));
printf("the strncpy2 is %s \n", Strncpy1(str1,str2,4));
printf("the strcat is %s \n", Strcat(str1,str2));
    printf("the stncmp is %d \n",Scncmp(str1,str2,3));
//printf("the atoi is %d  \n",Atoi(str3));//结果不输出
//printf("the itoa is %s  \n",Itoa(str4,num)); //结果输出有问题
printf("the count num is %d \n",Countnum(str2));  
printf("the word num is %d \n",Wordnum(str5));


getchar();
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值