zoukankan      html  css  js  c++  java
  • C语言字符串操作函数

    C语言字符串操作函数

     

     

    1. 字符串反转 - strRev

    2. 字符串复制 - strcpy

    3. 字符串转化为整数 - atoi

    4. 字符串求长 - strlen

    5. 字符串连接 - strcat

    6. 字符串比较 - strcmp

    7. 计算字符串中的元音字符个数

    8. 判断一个字符串是否是回文

     

    1. 写一个函数实现字符串反转

     

    版本1 - while版

     

    void strRev(char *s)

    {

        char temp, *end = s + strlen(s) - 1;

        while( end > s)

        {

            temp = *s;

            *s = *end;

            *end = temp;

            --end;

            ++s;

        }

    }

     

    版本2 - for版

     

    void strRev(char *s)

    {

        char temp;

        for(char *end = s + strlen(s) - 1; end > s ; --end, ++s)

        {

            temp = *s;

            *s = *end;

            *end = temp;

        }

    }

     

    版本3 - 不使用第三方变量

     

    void strRev(char *s)

    {

        for(char *end = s + strlen(s) - 1; end > s ; --end, ++s)

        {

            *s ^= *end;

            *end ^= *s;

            *s ^= *end;

        }

     

    版本4 - 重构版本3

     

    void strRev(char *s)

    {

        for(char *end = s + strlen(s) - 1; end > s ; --end, ++s)

        {

            *s ^= *end ^= *s ^= *end;

        }

    }

     

    版本5 - 重构版本4

     

    void strRev(char *s)

    {

        for(char *end = s + strlen(s) - 1; end > s ; *s++ ^= *end ^= *s ^= *end--);

    }

     

    版本6 - 递归版

     

    void strRev(const char *s)

    {

        if(s[0] == '\0')

            return;

        else

            strRev(&s[1]);

        printf("%c",s[0]);

    }

     

     

    2. 实现库函数strcpy的功能

     

    strcpy函数位于头文件<string.h>中

     

    版本1

     

    strcpy(char * dest, const char * src)

    {

        char *p=dest;

        while(*dest++ = *src++)

            ;

        dest=p;

    }

     

    版本2

     

    char * __cdecl strcpy(char * dst, const char * src)

    {

        char *p = dst;

        while( *p ++ = *src ++ )

            ;

        return dst;

    }

     

    版本3

     

    strcpy(char * dest, const char * src)

    {

        int i=0;

        for(; *(src+i)!='\0'; i++)

            *(dest+i) = *(src+i);

        *(dest+i) = '\0';

    }

     

     

    3. 实现库函数atoi的功能

     

    atoi函数位于头文件<stdlib.h>中

     

    版本1 - 附说明

     

    int power(int base, int exp)

    {

        if( 0 == exp )

            return 1;

        return base*power(base, exp-1);

    }

     

    int __cdecl atoi(const char *s)

    {

        int exp=0, n=0;

        const char *t = NULL;

        

        for(; *s == ' ' || *s == '\t' || *s == '\n'; s++) //找到第一个非空字符

            ;

        if( *s >'9' || *s <'0' ) //如果第一个非空字符不是数字字符,返回0

            return 0;

        

        for(t=s; *t >='0' && *t <='9'; ++t) //找到第一个非数字字符位置 - 方法1

            ;

        t--;

     

        /* 找到第一个非数字字符位置 - 方法2

        t=s;

        while(*t++ >='0' && *t++ <='9')

            ;

        t -= 2;

        */

     

        while(t>=s)

        {

            n+=(*t - 48)*power(10, exp); //数字字符转化为整数

            t--;

            exp++;

        }

        return n;

    }

     

    版本2

     

    int __cdecl atoi(const char *s)

    {

        int exp=0, n=0;

        const char *t = NULL;

        

        for(; *s == ' ' || *s == '\t' || *s == '\n'; s++) //略过非空字符

            ;

        if( *s >'9' || *s <'0' )

            return 0;

        

        for(t=s; *t >='0' && *t <='9'; ++t)

            ;

        t--;

     

        while(t>=s)

        {

            n+=(*t - 48)*pow(10, exp);

            t--;

            exp++;

        }

        return n;

    }

     

     

    4. 实现库函数strlen的功能

     

    strlen函数位于头文件<string.h>中

     

    版本1 - while版

     

    size_t  __cdecl strlen(const char * s)

    {

        int i = 0;

        while( *s )

        {

            i++;

            s++;

        }

        return i;

    }

     

    版本2 - for版

     

    size_t  __cdecl strlen(const char * s)

    {

        for(int i = 0; *s; i++, s++)

            ;

        return i;

    }

     

    版本3 - 无变量版

     

    size_t  __cdecl strlen(const char * s)

    {

        if(*s == '\0')

            return 0;

        else

            return (strlen(++s) + 1);

    }

     

    版本4 - 重构版本3

     

    size_t  __cdecl strlen(const char * s)

    {

        return *s ? (strlen(++s) + 1) : 0;

    }

     

     

    5. 实现库函数strcat的功能

     

    strcat函数位于头文件<string.h>中

     

    版本1 - while版

     

    char * __cdecl strcat(char * dst, const char * src)

    {

        char *p = dst;

        while( *p )

            p++;

        while( *p ++ = *src ++ )

            ;

        return dst;

    }

     

     

    6. 实现库函数strcmp的功能

     

    strcmp函数位于头文件<string.h>中

     

    版本1 - 错误的strcmp

     

    int strcmp(const char * a, const char * b)

    {

        for(; *a !='\0' && *b !='\0'; a++, b++)

            if( *a > *b)

                return 1;

            else if ( *a==*b)

                return 0;

            else

                return -1;

    }

     

    版本2

     

    int __cdecl strcmp (const char * src, const char * dst)

    {

            int ret = 0 ;

     

            while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *src)

                    ++src, ++dst;

     

            if ( ret < 0 )

                    ret = -1 ;

            else if ( ret > 0 )

                    ret = 1 ;

     

            return( ret );

    }

     

     

    7. 计算字符串中元音字符的个数

     

    #include <stdio.h>

     

    int is_vowel(char a)

    {

        switch(a)

        {

        case 'a': case 'A':

        case 'e': case 'E':

        case 'i': case 'I':

        case 'o': case 'O':

        case 'u': case 'U':

            return 1; break;

        default: 

            return 0; break;

        }

    }

     

    int count_vowel(const char *s)

    {

        int num;

        if(s[0] == '\0')

            num = 0;

        else

        {

            if(is_vowel(s[0]))

                num = 1 + count_vowel(&s[1]);

            else

                num = count_vowel(&s[1]);

        }

        return num;

    }

     

    int main()

    {

        char *s=" AobCd ddudIe";

        printf("%d \n", count_vowel(s));

        return 0;

    }

     

     

    8. 判断一个字符串是否回文:包含一个单词,或不含空格、标点的短语。如:Madam I'm Adam是回文

     

    版本1

     

    /*

     * 程序功能:判断一个单词,或不含空格、标点符号的短语是否为回文(palindrome)

     */

    #include <stdio.h>

    #include <ctype.h>

     

    int is_palindrome(const char *s)

    {

        bool is_palindrome=0;

        const char *end=s;

     

        if(*end == '\0') /* 如果s为空串,则是回文 */

            is_palindrome=1;

     

        while(*end) ++end; /* end指向串s最后一个字符位置 */

        --end;

     

        while(s<=end)

        {

            while(*s==' ' || !isalpha(*s)) /* 略去串s中的非字母字符 */

                ++s;

            while(*end==' ' || !isalpha(*end))

                --end;

            if(toupper(*s) == toupper(*end)) /* 将s中的字母字符转换为大字进行判断 */

            {

                ++s;

                --end;

            } 

            else 

            {

                is_palindrome=0; break;

            } /* 在s<=end的条件下,只要出现不相等就判断s不是回文 */

        }

        if(s>end)

            is_palindrome=1;

        else

            is_palindrome=0;

        return (is_palindrome);

     

    }

     

    int main()

    {

        const char *s ="Madam  I' m   Adam";

        printf("%s %s \n", s, is_palindrome(s) ? "is a palindrome!": "is not a palindrome!");

        return 0;

    }


  • 相关阅读:
    使用国内镜像安装pyqt5
    python线程池 ThreadPoolExecutor 的用法及实战
    进程和线程、协程的区别
    python线程池实现
    python 多进程使用总结
    参与开源项目
    脑图——前端技术
    HTML中DTD使用小结
    浅谈面向对象——追溯法
    Dva.js 里面的几个概念
  • 原文地址:https://www.cnblogs.com/zzxap/p/2175700.html
Copyright © 2011-2022 走看看