C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

来源:互联网 发布:nginx部署nodejs项目 编辑:程序博客网 时间:2024/06/05 11:40

http://www.cnblogs.com/JCSU/articles/1305401.html


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;
        
* =  * 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;
        
* =  * end;
        
* end  =  temp;
    }
}


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

void  strRev( char   * s)
{
    
for (char   * end  = s  +  strlen(s)  -   1 ; end >  s ;  -- end,  ++s)
    {
        
* ^=  * end;
        
* end  ^=  * s;
        
* ^=  * end;
    }


版本4 - 重构版本3

void  strRev( char   * s)
{
    
for (char   * end  = s  +  strlen(s)  -   1 ; end >  s ;  -- end,  ++s)
    {
        
* ^=  * end  ^=   * ^=   * end;
    }
}


版本5 - 重构版本4

void  strRev( char   * s)
{
    
for (char   * end  = s  +  strlen(s)  -   1 ; end >  s ;  * s ++  ^=   * end ^=   * ^=  * 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  * =  dst;
    
while * ++   =   *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  __cdeclatoi( const   char  * s)
{
    
int  exp= 0 , n = 0;
    
const   char  * =  NULL;
    
    
for (; * ==   '  '   ||  * ==   '/t '   ||  * ==   '/n ' ; s ++ // 找到第一个非空字符
        ;
    
if * > ' 9'   ||   * < ' 0 ' )  // 如果第一个非空字符不是数字字符,返回0
         return  0 ;
    
    
for (t= s;  * >=' 0 '   &&  * <= '9 ' ++ t) // 找到第一个非数字字符位置 - 方法1
        ;
    t
-- ;

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

    
while (t >= s)
    {
        n
+= ( * -   48 ) *power( 10 , exp);  // 数字字符转化为整数
        t --;
        exp
++ ;
    }
    
return  n;
}


版本2

int  __cdecl atoi( const   char  * s)
{
    
int  exp= 0 , n = 0;
    
const   char  * =  NULL;
    
    
for (; * ==   '  '   ||  * ==   '/t '   ||  * ==   '/n ' ; s ++ // 略过非空字符
        ;
    
if * > ' 9'   ||   * < ' 0 ' )
        
return   0 ;
    
    
for (t= s;  * >=' 0 '   &&  * <= '9 ' ++ t)
        ;
    t
-- ;

    
while (t >= s)
    {
        n
+= ( * -   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 (* ==   '/0 ' )
        
return   0 ;
    
else
        
return  (strlen( ++ s)  +  1 );
}


版本4 - 重构版本3

size_t  __cdecl  strlen(const   char   * s)
{
    
return   * ?  (strlen(++ s)  +   1) :  0 ;
}



5. 实现库函数strcat的功能

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

版本1 - while版

char   *  __cdecl  strcat(char   *  dst,  const  char   *  src)
{
    
char  * =  dst;
    
while * p )
        p
++ ;
    
while * ++   =   *src  ++  )
        ;
    
return  dst;
}



6. 实现库函数strcmp的功能

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

版本1 - 错误的strcmp

int  strcmp( const   char  *  a,  const   char  *  b)
{
    
for (; * != ' /0'   &&   * != ' /0 '; a ++ , b ++ )
        
if * >   * 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   * =" Madam  I' m   Adam ";
    printf(" %s %s /n" , s, is_palindrome(s) ?   " is a palindrome! " "is not a palindrome! ");
    return   0;
}


趣的 He lived as a devil, eh?

Don't nod
Dogma: I am God
Never odd or even
Too bad – I hid a boot
Rats live on no evil star
No trace; not one carton
Was it Eliot's toilet I saw?
Murder for a jar of red rum
May a moody baby doom a yam?
Go hang a salami; I'm a lasagna hog!
Satan, oscillate my metallic sonatas!
A Toyota! Race fast... safe car: a Toyota
Straw? No, too stupid a fad; I put soot on warts
Are we not drawn onward, we few, drawn onward to new era?
Doc Note: I dissent. A fast never prevents a fatness. I diet on cod
No, it never propagates if I set a gap or prevention
Anne, I vote more cars race Rome to Vienna
Sums are not set as a test on Erasmus
Kay, a red nude, peeped under a yak
Some men interpret nine memos
Campus Motto: Bottoms up, Mac
Go deliver a dare, vile dog!
Madam, in Eden I'm Adam
Oozy rat in a sanitary zoo
Ah, Satan sees Natasha
Lisa Bonet ate no basil
Do geese see God?
God saw I was dog
Dennis sinned


世界之最: 世界上最长的回文包含了17,259个单词

 
说明: __cdecl,__stdcall是声明的函数调用协议.主要是传参和弹栈方面的不同.一般c++用的是__cdecl,windows里大都用的是__stdcall(API)