Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4842351
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-07-20 22:31:49

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入I am a student.,则输出student. a am I
分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。
由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。
还是以上面的输入为例子。翻转I am a student.中所有字符得到.tneduts a ma I,再翻转每个单词中字符的顺序得到students. a am I,正是符合要求的输出。
 
 

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

void revert(char* str, int begin, int end)
{
   int len = end - begin;
   int i;
   char tmp;
   for(i=0;i<len/2;i++)
    {
      tmp = str[begin+i];
      str[begin+i] = str[begin+len-i-1];
      str[begin+len-i-1] = tmp;
     }
}

char* str_process(char* str)
{
   int len = strlen(str);
   revert(str,0,len);
   printf("after revert the str is %s\n",str);
   char* tmp = str;
   int start = 0;
   int end = 0;
   
   while(tmp[end]!='\0')
    {
      if(str[start] == ' ')
       {
         start++;
         end++;
         continue;
       }
      else if(str[end] == ' ' || str[end] == '\0')
      {
        revert(str,start,end);
        start = end;
       }
      else
      {
         end++;
       }
    }
    return str;
}
int main(int argc, char *argv[])
{
  char* str = (char*)malloc(MAX);
  sprintf(str, "%s", "I am a student.");
  printf("str is %s\n",str);
  printf("after process the str is %s\n",str_process(str));
  system("PAUSE");    
  return 0;
}
 

感谢梅总的指正,上面的代码如果str为"Ii am a student"就是说第一个单词为多个字符时就会错误,因为取不到str[end] == '\0'这个

修正代码如下:

 

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

void revert(char* str, int begin, int end)
{
   int len = end - begin + 1;
   int i;
   char tmp;
   for(i=0;i<len/2;i++)
    {
      tmp = str[begin+i];
      str[begin+i] = str[begin+len-i-1];
      str[begin+len-i-1] = tmp;
     }
}

char* str_process(char* str)
{
   int len = strlen(str);
   revert(str,0,len-1);
   printf("after revert the str is %s\n",str);
   //char* tmp = str;

   int start = 0;
   int end = 0;
   
   while(str[end]!='\0')
    {
      system("PAUSE");
      printf("start is %c, end is %c\n", str[start],str[end]);
      if(str[start] == ' ')
       {
         start++;
         end++;
         continue;
       }
      else if(str[end+1] == ' ')
      {
        revert(str, start, end);
        end++;
        start = end;
       }
      else if( str[end + 1] == '\0')
       {
        revert(str, start, end);
        end++;
       }
      else
        end++;
    }
    return str;
}
int main(int argc, char *argv[])
{
  char* str = (char*)malloc(MAX);
  sprintf(str, "%s", "We love china");
  printf("str is %s\n",str);
  printf("after process the str is %s\n",str_process(str));
  system("PAUSE");    
  return 0;
}
 

阅读(1227) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~