字符串反序

本文介绍了一个名为RvsStr的函数,该函数能够识别并反序字符串中的单词,并确保单词间以空格分隔。特别地,该函数还考虑到了由'-'连接的单词情况。通过标准化输入字符串并移除非字母字符,最终实现对字符串的有效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
** 名称: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();
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值