当前位置 博文首页 > Geek宝宝的努力!:C语言:自定义字符串函数

    Geek宝宝的努力!:C语言:自定义字符串函数

    作者:[db:作者] 时间:2021-06-14 15:34

    任务代码:


    字符串复制(自定义函数):

    指针法1:

    #include <stdio.h>
    
    char *scopy(char *str1,const char *str2);//最后返回的是一个字符串也就是字符数组,所以用指针返回
    
    int main()
    {
        char s1[50];
        char s2[]="i am happy!";
        
        scopy(s1,s2);
        
        printf("%s\n",s1);
        return 0;
        
    }
    
    char *scopy(char *str1,const char *str2)
    {
        int i=0,j=0;
        while(str2[j]!='\0')
        {
            str1[i]=str2[j];
            i++;
            j++;
        }
        str1[i]='\0';//字符数组结束的标志
        return str1;
    }


    指针法2:

    #include <stdio.h>
    
    char *scopy(char str1[],const char str2[]);
    
    int main()
    {
        char s1[50];
        char s2[]="i am happy!";
        
        scopy(s1,s2);
        
        printf("%s\n",s1);
        return 0;
        
    }
    
    char *scopy(char *str1,const char *str2)
    {
        char *p1=str1;
        const char *p2=str2;
        
        while(*p2!='\0')
        {
            *p1=*p2;
            p1++;
            p2++;
        }
        *p1='\0';
        return p1;
    }


    一些更有c语言味道的写法:

    char *scopy(char *str1,const char *str2)
    {
        char *p1=str1;
        const char *p2=str2;
        
       while(*p1)
       {
           *p1++=*p2++;//因为到最后的p2结束时为空,所以赋值给p1后判断p1为空结束
       }
       *p1='\0';
       return p1;
    }
    



    数组法:

    #include <stdio.h>
    
    char *scopy(char str1[],const char str2[]);//最后返回的是一个数组,所以使用指针返回
    
    int main()
    {
        char s1[50];
        char s2[]="i am happy!";
        scopy(s1,s2);
        printf("%s\n",s1);
        return 0;
    }
    
    char *scopy(char str1[],const char str2[])
    {
     int i=0,j=0;
     while(str2[j]!='\0')
     {
        str1[i++]=str2[j++];
     }
     str1[i]='\0';
     return str1;
    }
    


    比较字符串(自定义函数):

    #include <stdio.h>
    #include <ctype.h>
    
    int  scomp(char str1[],const char str2[]);//因为是返回值是一个数字来确定是否是对比相同,所以返回int
    
    int main()
    {
        char s1[]="I A haPpy!";
        char s2[]="i am happy!";
        
        int index;
        index=scomp(s1,s2);
        
        printf("%d",index);
        return 0;
        
        
    }
    
    int  scomp(char *str1,const char *str2)
    {
        const char *p=str1,*q=str2;
        while(tolower(*p)==tolower(*q)&&*p!='\0'&&*q!='\0')//tolower是把大写字母转换成小写字母,其作用可惜忽视大小写带来的问题
        {
            p++;
            q++;
        }
        if(tolower(*p)>tolower(*q))
        {
            return 1;
        }
        else if(tolower(*p)<tolower(*q))
        {
            return -1;
        }
        else return 0;//相等的,返回0
    }

    另一种:

    #include <stdio.h>
    #include <ctype.h>
    
    int  scomp(char str1[],const char str2[]);//因为是返回值是一个数字来确定是否是对比相同,所以返回int
    
    int main()
    {
        char s1[]="I A haPpy!";
        char s2[]="i am happy!";
        
        int index;
        index=scomp(s1,s2);
        
        printf("%d",index);
        return 0;
        
        
    }
    
    int  scomp(char *str1,const char *str2)
    {
        int i=0;
        char c1,c2;
        do
        {
            c1=(str1[i]>='A'&& str1[i]<='Z')?str1[i]+32:str1[i];//这里使用技巧,指导所有的小写字母都比大些字母的ASEII码大32
            c2=(str2[i]>='A'&& str2[i]<='Z')?str2[i]+32:str2[i];
            i++;
        }while(c1==c2  && c1!='\0' && c2!='\0');//如果没有不相等或者循环玩结束
        
        if(c1>c2)
        {
            return 1;
        }
        else if(c1>c2)
        {
            return -1;
        }
        else return 0;
    }
    

    统计单词个数:

    #include <stdio.h>
    
    int wordnum(const char *str);
    
    int main()
    {
        char s[81];
        gets(s);
        printf(" \"%s\" have %d words.\n",s,wordnum(s));
        return 0;
    }
    
    int wordnum(const char *str)
    {
        int i,num=0,word=0;//word不计数,只是一个开关
        for(i=0;(*(str+i)!='\0');i++)
        {
            if(*(str+i)==' ')
                word=0;
            else if(word==0)//既不是空格又不是0代表这个单词还没有完
            {
                word=1;
                num++;
            }
        }
        return num;
    }