天天看點

C語言實作字元串相關函數(嵌入式C語言面試)

1.翻轉字元串

題目:翻轉字元串單詞順序

輸入一個英文句子,翻轉句子中單詞的順序,但單詞内字元的順序不變

解題思路:先反轉字元串,再翻轉單詞

C語言代碼如下:

//  字元串翻轉函數  pBegin:字元串開始位置   pEnd:字元串結束位置
void Reverse(char *pBegin,char *pEnd)
{
    if(pBegin==NULL||pEnd==NULL)
    {
        return;
    }
    while(pBegin<pEnd)
    {
        char tmp=*pBegin;
        *pBegin=*pEnd;
        *pEnd=tmp;
        pBegin++;
        pEnd--;
        
    }
}
//總體函數實作
void ReverseSenrence(char *pData)
{
    if(pData==NULL)
    {
        return ;
    }
    char *Begin=*PData;
    char *End=*PData;
    while(*End!='\0')
    {
        End++;
    }
    End--;
    Reverse(Begin,End);  //翻轉整個句子
    while(*Begin!='\0')
    {
        if(*Begin=='')
        {
            Begin++;
            End++;
        }
        else if(*End==''||*End=='\0')
        {
            Reverse(Begin,--End);//翻轉單詞
            Begin=++End;
        }
        else
        {
            End++;
        }
    }
    return pData;
}      

2.左旋轉字元串

//字元串翻轉函數
void Reverse(char *pBegin,char *pEnd)
{
    if(pBegin==NULL||pEnd==NULL)
    {
        return;
    }
    while(pBegin<pEnd)
    {
        char tmp=*pBegin;
        *pBegin=*pEnd;
        *pEnd=tmp;
        pBegin++;
        pEnd--;
    }
    
}
//左旋轉字元串實作
char* LeftRotateString(char *pData,int n)
{
    int nLength=strlen(pData);
    if(pData!=NULL)
    {
        if(nLength>0&&n<nLength&&n>0)
        {
            char *FirstPart=pData;
            char *EndPart=pData+n-1;
            char *SecondPart=pData+n;
            char *SecondEnd=pData+nLength-1;
            Reverse(FirstPart,EndPart);
            Reverse(SecondPart,SecondEnd);
            Reverse(pData,SecondEnd);
        }
        
    }
}      

3.字元串比較函數

int strcmp(const char *src,const char *dst)
{
    //字元串相等傳回0,src<dst,src>dst傳回正數
    int ret=0;
    while(!(ret=*src-*dst)&&*dst)
    {
        ++src;
        ++dst;
    }
    if(ret<0)
    {
        ret=-1;
    }else if(ret>0)
    {
        ret=1;
    }
    return(ret);
}

//判斷字元串是否相同
int strcmp(char *src,char *dst)
{
    int ret=0;
    if(NULL==dst||NULL==src)
    {
        return 1;
    }
    if(strlen(src)!=strlen(dst))
    {
        return 1;
    }
    while(!(ret=*src-*dst))
    {
        ++src;
        ++dst;
    }
    return ret;
}

//忽略大小寫字元串比較
#define
int strcmp(char *dst,char *str)
{
    int i,len;
    if(NULL==dst||NULL==str)
    {
        return 1;
    }
    if(strlen(dst)!=strlen(str))
    {
        return 1;
    }
        while(!(ret=CONVERT(*src)-CONVERT(*dst)))
    {
 
        ++src;
        ++dst;
    }
    return ret;
}      

4.字元串複制函數

char * strcpy(char *dst,const char *str)
{
    if(dst==NULL||str==NULL)
    {
        return NULL;
    }
    char * ret=dst;
    while(*str!='\0')
    {
        *dst++=*str++;
    }
    return ret;
}      

5.整型字元串

//整型轉字元串。 num :整數  str :存放的字元串   radix: 進制數  例如:2 8 10 16
char *itoa(int num,char *str,unsigned int radix)
{
    char index[]="0123456789ABCDEF";
    int i=0;
    int k=0;
    unsigned int tmp_value;
    if(radix!=2&&radox!=8&&radix!=10&&radix!=16)
    {
        return False;
    }
    //判斷正負
    if(radix==10&&num<0)
    {
        str[i++]='-';
        tmp_value=(unsigned int)(0-value);
        k=1;
    }
    else
    {
        tmp_value=(unsigned int)value;
    }
    do
    {
        str[i++]=index[tmp_value%radix];
        tmp_value/=radix;
    }while(tmp_value)
    srt[i]='\0';
    
   //翻轉
    char tmp;
    for(int j=k;j<=(i-1)/2;j++)
    {
        temp=str[j];
        str[j]=str[i+k-j-1];
        str[i+k-j-1]=temp;
    }
    return str;
}      

6.字元串轉成整型

int atoi(const char *src)
{
    bool isMinus =false;
    int s=0;  //傳回值
    //跳過空白符
    while(*src=='')
    {
        src++;
    }
    if(*src=='+'||*src=='-')
    {
        if(*src=='-')
        {
        isMinus=true;
        }
        src++;
    }
    else if(*src<'0'||*src>'9')//第一位既不是符号也不是數字,直接傳回異常值
    {
        s=111111;   //自定義異常值
        return s;
    }
    
    while(*src!='\0'&&*src>='0'&&*src<='9')
    {
        s=s*10+*src-'0';
        src++;
    }
    return s*(isMinus?-1:1);
}      

繼續閱讀