[字符串处理算法]对输入字符串中的单词进行反转的算法设计和C代码实现。例如,如果输入字符串是“Hello,howdoyoudo”,则输出字符串是“doyoudohowHello,”。注意保留单词和相应标点符号之间的空格。2.算法设计通过观察示例字符串(即“你好,你好”),我们可以看出字符串中每个词与空格的关系是:总词数=总空格数+1。也就是说,示例字符串中的空格总数为4,单词数为5(即“Hello”、“how”、“do”、“you”、“do”)。因此,我们可以考虑先找出输入字符串中的空格总数,然后根据空格找到每个单词,然后将这些单词倒序组装。程序总体流程如图1所示。图1程序总体流程3.特殊流程注意事项在编写程序的过程中,我们需要考虑输入字符串的格式,例如:1.输入字符串的前几个字符是空格,即形如“Hello,howdoyoudo”,我们需要去掉前几个空格,才能进行后续处理。2、输入字符串的最后几个字符是空格,即形状是“你好,你好”,我们需要去掉最后几个空格,然后再进行后续处理。3、输入字符串的中间字符为连续空格,形式为“Hello,howdoyoudo”。在进行后续处理之前,我们需要将连续的空格合并为一个空格。4.只要输入字符串中两个词之间有空格,我们就把它们当作两个不同的词,即使这两个词没有实际意义,也就是形式为“你好,你好吗?”,虽然里面的“y”和“ou”要结合起来才有意义,但我们还是把它们当成两个不同的词来看待。4.程序代码/***************************************************************************Copyright(C)2016,ZhouZhaoxion.**文件名:ReverseTheString.c*文件ID:无*内容概要:将字符串中的单词顺序颠倒*其他说明:例如将“I'mastudent”改为“studentaI'm”*当前版本:V1.0*作者:周兆雄*完成日期:20160215****************************************************************************/#include#include//重新定义数据typetypedefsignedcharINT8;typedefunsignedshortintUINT16;typedefintINT32;typedefunsignedintUINT32;//函数声明******************************************************************函数说明:主函数*输入参数:无*输出参数:无*返回值:0-执行成功其他-执行失败*其他说明:无*修改日期版本号修饰符修饰内容*--------------------------------------------------------------------*20160215V1.0ZhouZhaoxiong创建**********************************************************************************/INT32main(){INT8szTestStr[500]={0};INT8szTmpStr[500]={0};//用来存储归一化的st环INT8szResultStr[500]={0};INT8szFieldVal[100]={0};INT32iPosFlag=0;INT32iRetFlag=0;UINT32iBlankCount=0;printf("Pleaseinputthestring:\n");gets(szTestStr);printf("TestStr=%s\n",szTestStr);//去除测试中多余的空格和前后字符stringSpaceCombineSpace(szTestStr,szTmpStr);//获取测试字符串中空格字符个数iPosFlag=0;while(szTmpStr[iPosFlag]!='\0'){if(szTmpStr[iPosFlag]==''){iBlankCount++;}iPosFlag++;}//将测试字符串中的单词倒序拼接strcat(szTmpStr,"");//在测试字符串中添加空格***解析每个单词for(iPosFlag=iBlankCount;iPosFlag>=0;iPosFlag--){memset(szFieldVal,0x00,sizeof(szFieldVal));iRetFlag=GetFieldFromString(szTmpStr,'',iPosFlag,szFieldVal,sizeof(szFieldVal)-1);if(iRetFlag!=0){printf("ExecGetFieldFromStringtogetFieldValfailed!\n");return-1;}if(strlen(szResultStr)>sizeof(szResultStr)-1)//字符串太长,直接退出{break;}else{strcat(szResultStr,szFieldVal);//将每个单词拼接在一起strcat(szResultStr,"");//在每个单词后添加空格}}if(szResultStr[strlen(szResultStr)-1]==''){szResultStr[strlen(szResultStr)-1]='\0';//去掉***边的空格}printf("ResultStr=%s\n",szResultStr);return0;}/******************************************************************************功能描述:从字符串中获取字段的值*输入参数:无*输出参数:无*返回值:0-执行成功Others-执行失败*其他说明:无*修改日期版本号修改内容修改*--------------------------------------------------------------------*20160215V1.0ZhouZhaoxion创建******************************************************************************/INT32GetFieldFromString(INT8*pszIn,INT8cSplitter,UINT16iIdx,INT8*pszOut,UINT16iLen){INT8*pszStart=NULL;INT8*pszEnd=空;UINT16iCount=0;UINT16iFiledLen=0;INT8szBuf[1024]={0};if(NULL==pszIn||NULL==pszOut){return-1;}pszStart=pszIn;for(iCount=0;iIdx!=iCount;iCount++)//for循环到找到当前字段的起始位置{pszStart=strchr(pszStart,cSplitter);if(NULL==pszStart){break;}else{pszStart++;}}if(NULL==pszStart){return-2;}pszEnd=strchr(pszStart,cSplitter);if(NULL==pszEnd){return-3;}//判断长度,防止复制字符串时越界if(pszEnd-pszStart>sizeof(szBuf)-1){iFiledLen=sizeof(szBuf)-1;}else{iFiledLen=pszEnd-pszStart;}strncpy(szBuf,pszStart,iFiledLen);if(iLen