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 CONVERT(c) (((c)>='A'&&(c)<='A')?((c)-'A'+'a'):(c))
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.整型字符串

每个整数看其转换进制,从个位到百位都可以通过%操作加上/操作获得,再用一个一个字符数组保存0-F,用个位数对应值转换为字符。 最后还要翻转。

//整型转字符串。 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);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值