程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言字符串操作函數

C語言字符串操作函數

編輯:關於C語言

C語言字符串操作函數

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;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved