颠倒单词的出现次序

转载 2006年05月30日 19:43:00

[题目]:请编写一个函数来颠倒单词在字符串里的出现顺序。例如,将字符串“Do or not do, there is no try.”转换为“try. no is there do, not or Do”假设所有单词都以空格为分隔符,标点符号也当作字符来对待。

        对于这类颠倒字符或者单词的处理,我们通常的办法是采用一个临时缓冲区,将识别出来的字符或者单词写道这个缓冲区里,最后把缓冲区的内容拷贝回原来的字符串。
       从字符串尾开始逆向扫描,首先让指针扫描到字符“y” ,指针递减,继续扫描到这个单词的第一个字符“t”,将“t”到“y”之间的字符逐个拷贝到临时缓冲区,即将try单词拷贝到缓冲区。然后把空格直接拷贝到缓冲区。当把“D”、“o”拷贝到缓冲区后,不要忘了在临时缓冲区的末尾加上一个‘/0’字符。

    void reversewords (char str[])
     {
      char *buffer;
      int tokenreadpos, wordreadpos,wordend,writepos = 0;
      tokenreadpos =strlen(str)-1;
      buffer = (char *) malloc (tokenreadpos + 2);
      if (!buffer)
        return NULL;
      while(tokenreadpos>=0)
      {
        if(str[tokenreadpos] ==' ')
           buffer[writepos++] = str[tokenreadpos--];
        else
          {
           wordend = tokenreadpos;
           while (tolenreadpos>=0 && str[tokenreadpos]!= ' ')
               tokenreadpos--;
           wordreadpos = tokenreadpos+1;
           while(wordreadpos <= wordend)
               buffer[writepos++] = str[wordreadpos++];
          }
       }
      buffer[writepos]='/0';
      strcpy(str,buffer);
      free(buffer);
      return str;
      }

        如果我们不另外分配一个临时缓冲区,还可以完成这个操作么?用交换字符的办法也能对字符串进行颠倒。通过逆转字符,我们首先将字符串转换为“ ytr on si ereht od ton  ro oD”,我们只要把颠倒过来的字符串中的每一个单词在颠倒一遍,就能得到我们想要的字符串了。所以,我们只需要写一个对字符串本身进行逆转的函数就能完成任务了。

#include <iostream.h>
#include <string.h>
void ReverseWords (char str[]);   
void ReverseString (char str[], int start, int end);   //逆转字符串函数

void main()
{
 char str[40];
 cout<<"请输入一行句子(以回车符结束): ";
 cin.getline(str,40);    //getline将输入的字符串(可以包含空格)的前39个字符拷贝到str数组中,
 ReverseWords(str);
 cout<<"输出颠倒单词后的句子: "<<str<<endl;
}

void ReverseWords (char str[])
{
  int start=0,end=0,length;
  length=strlen(str);
  ReverseString(str,start,length-1);
  while(end<length)
      {
 if(str[end]!=' ')
  {
    start=end;
           while(end<length&&str[end]!=' ')
         end++;
    end--;
    ReverseString(str,start,end);
   }
 end++;
 }
      return;
}

void ReverseString (char str[],int start,int end)
{
  char temp;
  while (end>start)
  {
   temp=str[start];
   str[start]=str[end];
   str[end]=temp;
   start++;
   end--;
   }
  return;
}

运行结果:
请输入一行句子(以回车符结束):Do or not do, there is no try.
输出颠倒单词后的句子:try. no is there do, not or Do

相关文章推荐

java 统计10000篇文章中不同单词出现的次数并以次序排序

统计10000篇文章中不同单词出现的次数并以次序排序 此次统计从两方面入手:一是单线程读取10000个文件;二是打开10000个线程,每个线程读取一个文件 单线程程序 import java.io...

vim一行内交换单词的次序以及文本数据的列交换

需求描述 1.假设将英文中所有中文名字为“Fan JianQiang”改成“QiangJian Fan” 2.将所有“change world,change mind!”替换成“change mind...

给定数组,将所有的数按照出现的次序由大到小输出,次数相同的,按照原数组的顺序输出

import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u...
  • wwe4023
  • wwe4023
  • 2017年05月15日 16:29
  • 124

嘿牛程序员_成都传智博客_讨论字符串中字符出现的次数(续二:通过对象列表实现按次序输出)

---------------------- android培训、java培训、期待与您交流! ---------------------- 本节继续介绍将一组字符串中不同的字符出现的次数按多少次序...

嘿牛程序员_成都传智博客_讨论字符串中字符出现的次数(续一:通过数组实现按次序输出)

---------------------- android培训、java培训、期待与您交流! ---------------------- 本节介绍将一组字符串中不同的字符出现的次数按多少次序输出...

编程题 矩阵一周元素之和与单词颠倒位置输出

xx科技2016年校园招聘 编程题 矩阵一周元素之和与单词颠倒位置输出

单词出现次数

  • 2017年11月03日 09:34
  • 1KB
  • 下载

文章中单词出现次数统计代码

  • 2014年08月23日 23:51
  • 712B
  • 下载

统计分析文章中英文单词出现次数及频率(C++实现)

设计思路: 1.为了统计数据具有实际意义: 统计中需要剔除一些无统计意义的词,例如 am is are 等虚词、代词、连词等。 一般的文章句首单词首字母为大写,此时需要将此类情况的大写字母转化为...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:颠倒单词的出现次序
举报原因:
原因补充:

(最多只允许输入30个字)