/*
** 名称:RvsStr
** 功能:识别字符串中的单词后反序,输出的单词之间以一个空格分隔。如果'-'连接了两个字母,则认为其为一个单词。
** 参数:char *src [in] char *rst [out]
** 说明:
*/
#include <stdio.h>
#define JUDGE(C) ((*(C) >= 'a' && *(C) <= 'z') || (*(C) >= 'A' && *(C) <= 'Z'))
#define MAXWORLDLEN(h,t) if((t)-(h)>20 || ((t)-(h))<0 ){return -1;}
/*字符串反序*/
void ReverseStr(char* head, char* tail)
{
while(head < tail)
{
*head ^= *tail;
*tail ^= *head;
*head ^= *tail;
head++;
tail--;
}
}
/*将字符串中的非字母字符去除*/
void RecongnizeWord(char * src,char * rst)
{
char *p = src;
char *q = rst;
while(!JUDGE(p)&& *p != '\0')//找到第一个字母位置
p++;
while( '\0' != *p)
{
if(JUDGE(p)) //如果是字母
{
*q++ = *p++;
}
else if( '-' == *p ) //如果是‘-’
{
if(JUDGE(p+1) && (p-1)>= src && JUDGE(p-1))
*q++ = *p++;
else
{
p++;
if((q-1) >= rst && ' ' != *(q-1))
*q++ = ' ';
}
}
else if( ' ' == *p ) //如果是‘ ’
{
if((q-1) >= rst && *(q-1) != ' ')
*q++ = *p++;
else
p++;
}
else //其他字符
{
p++;
if((q-1) >= rst && ' ' != *(q-1))
*q++ = ' ';
}
}
*q = '\0';
q -= 1;
while(*q == ' '&& q >= rst)//去除字符串尾空格
*q-- = '\0';
}
/*成功返回0,失败返回-1*/
int RvsStr(char * src,char * rst)
{
if(NULL==src||NULL==rst)
return -1;
RecongnizeWord(src,rst);//将字符串标准化为以空格分隔的格式
char * h = rst;
char * e = rst;
if(*rst=='\0') //如果字符串中不包含单词
return -1;
while('\0' != *e)
{
if( ' ' == *e )
{
MAXWORLDLEN(h,e)//判断单词长度是否大于20
ReverseStr(h,e-1);
h = ++e;
}
else
{
++e;
}
}
MAXWORLDLEN(h,e)
ReverseStr(h,e-1);
ReverseStr(rst,e-1);
*e = '\0';
return 0;
}
void main()
{
char src[] = "-oops - - I am a student,do -you- believe--it$?\n y-e-s\n\
";
char rst1[256] = {0};
int iRt = RvsStr(src,rst1);
if( 0 == iRt )
{
puts(src);
puts(rst1);
}
else
{
puts("error");
}
getchar();
}
字符串反序
最新推荐文章于 2022-11-03 21:48:41 发布