给定一个字符串,按单词将该字符串逆序

来源:互联网 发布:vscode 远程编辑 编辑:程序博客网 时间:2024/05/16 12:39

在学习过程中,遇到这样一个功能:请输入一个字符串,将其逆序排列

  1. 如输入"hello world",输出为"world hello"。 
借鉴了网上的思路:

  1. 思路: 先按单词逆序,再对整个句子逆序。 
  2. "hello world" ==> "olleh dlrow" ==> "world hello" 

那么,需要做两部分功能

第一,给定单词的首地址和尾地址,将其倒序(也就是交换功能)

第二,将一个句子拆分为每个单词:

       单词尾地址根据指针q遇到(连续空格的)第一个空格判定:q-1

           单词首地址根据指针q遇到的不再是空格判定

代码:

  1. /************************************************* 
  2. 题目: 给定一个字符串,按单词将该字符串逆序,不包括标点 
  3. 如输入"hello world",输出为"world hello"。 
  4. *************************************************/
  5. #include<stdio.h>  
    #include <stdlib.h>

      void reverseWord(char *start, char *end)  
    {   
        char temp;
        while(start < end)  
        {  
            temp=*start ;  
            *start = *end;  
            *end = temp; 
            *start++;
            *end--; 
        }  
    }
      
    int main( ) {  
      
        char s[100]="i am  a   boy";  
       // printf("please input a string:\n");
        //gets(s);                   //从stdio流中读取字符串,直至接受到换行符或EOF时停止
        
       char *p=s;
       char *q=s;
       printf("倒序前:%s\n", s);  
       
       printf("开始地址:%x\n",q);
       while(*q != '\0')
       {
            if(' ' == *q)            //单词结尾:q首次遇到空格(此时将单词头地址p,和单词尾地址q-1) 
            {
                  printf("第一个空格地址:%x\n",q);
                  reverseWord(p,q-1); 
            
                  while(' ' == *q ) //单词开头:q跳若干空格后下一单词首字符 
                  { 
                       printf("space skip地址:%x\n",q);
                       q++;
                  }
                  p=q;              //单词头地址赋值给p 
            }
            else
            {
                 q++;               //单词内部地址自加 
            }
            
       }
       reverseWord(p,q-1);          //将最后一个单词逆序 
       reverseWord(s,q-1);          //将整句话逆序 
        
       printf("结尾地址:%x\n",q);
       printf("倒序后:%s\n", s);  
        system("pause");
        return 0;  
    }  


改进之处在于:

        网上的答案都没有考虑如果相邻之处如果有连续空格的情况,他们对空格也不停的翻转

       自己考虑到该功能其实稍微改进一下就是统计单词数功能,因此,如果遇到连续空格将其调过,仅仅对单词进行逆序。

本程序中:"i am  a   boy"依次为1,2,3个空格,我们很显然通过运行结果得到:


待优化处:

      交换功能,可以不引入第三个变量,而是通过位操作即可完成。

0 0
原创粉丝点击