天天看點

實作atoi,itoa,strcmp,strcpy,strcat,strlen函數

#include<iostream>

using namespace std;

void myitoa(const int num,char *ch);

int myatoi(const char *ch);

void mystrcpy(char* dest,const char* source);

int mystrcmp(char *source1,char*source2);

void mystrcat(char *dest,char *source);

int mystrlen(char *ch);

void main()

{

 int a=-123;

 char ch[10];

 myitoa(a,ch);

 cout<<a<<'/t'<<ch<<endl;

 char ch1[]="+123";

 int b;

 b=myatoi(ch1);

 cout<<ch1<<'/t'<<b<<endl;

 char ch_dest[10];

 mystrcpy(ch_dest,ch1);

 cout<<"複制源:"<<ch1<<endl;

 cout<<"複制點:"<<ch_dest<<endl;

 int flag;

 flag=mystrcmp(ch,ch_dest);

 if(flag)

 {

  cout<<"兩個字元串不相等"<<endl;

 }

 else

 {

  cout<<"兩個字元串相等"<<endl;

 }

 cout<<"mystrcat.........."<<endl;

 mystrcat(ch,"xiesiyuan");

 cout<<ch<<endl;

 cout<<"mystrlen.........."<<endl;

 cout<<mystrlen(ch)<<endl;

}

void myitoa(const int num,char *ch)

{

 int temp=num;

 int tag,i(0),j(0);

 char temp_ch[11];

 if(temp<0)

 {

  temp=-temp;

  tag=-1;

 }

 do

 {

  temp_ch[i++]=temp%10+'0';

  temp/=10;

 }while(temp>0);

 i--;

 if(tag==-1)  //負數

 {

  ch[j]='-';

  j++;

 }

 while(i>=0)

 {

  ch[j++]=temp_ch[i--];

 }

 ch[j++]='/0';

}

int myatoi(const char *ch)

{

 int sum(0),i(0),tag;

 while(ch[i]==' '||ch[i]=='/t')  //先消去前面的空格和制表符

 {

  i++;

 }

 if(ch[i]=='-')  //檢查是否是負數

 {

  tag=-1;

 }

 if(ch[i]=='-'||ch[i]=='+')  //檢查是否有符号

 {

  i++;

 }

 while(ch[i]!='/0')

 {

  sum=ch[i++]-'0'+sum*10;

 }

 if(tag==-1)  //負數

 {

  sum=-sum;

 }

 return sum;

}

char* mystrcpy(char* dest,const char* source)

{

 if((dest==NULL)||(source==NULL))

  return 0;

  char *temp=dest;

 while((*dest++=*source++)!='/0');

  return  temp

}

int mystrcmp(char *source1,char*source2)

{

     char *pt1=source1,*pt2=source2;

     do

     {

          char c1=*pt1++;

          char c2=*pt2++;

          if(c1=='/0'||c2=='/0')

             return c1-c2;

      }while((c1!='/0')&&(c2!='/0');

     return 0;

}

char* mystrcat(char *dest,char *source)

{

    if((dest==NULL)||(source==NULL))

        return 0;

    char *temp=dest;

    while(*dest++!='/0');

        dest--;

    while((*dest++=*source++)!='/0')

        return temp;

}

int mystrlen(char *ch)

{

    int len=0;

    char *temp=ch;

    while(*temp!='/0') 

    {

       len++;

       temp++;

     }

    return len;

}

實作atoi,itoa,strcmp,strcpy,strcat,strlen函數

需要注意的是:

1、程式的健壯性,檢查參數的有效性

2、檢查指針的有效性時候,盡量使用dest!=NULL,而不是用!dest這樣的形式,隐式轉換中char*和bool是相通的

2、檢查是否到大結尾,在循環裡面while()也用!='/0',另外注意的是邊界檢查