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