题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
#include<stdio.h> #include<assert.h> //45min void swap(char *a, char *b) { assert(a); assert(b); char temp; temp = *a; *a = *b; *b = temp; } void reverse(char * str,int start,int end) { assert(str); int j = (end-start)/2; for(int i =0; i<=j; i++) swap(&(str[start++]), &(str[end--])); } void ReverceSentence(char * Str) { assert(Str); int i = 0; while(Str[i] !=' ') { i++; } int strlen = i; //得到字符串的长度 //整个字符串进行翻转 reverse(Str,0,strlen-1); //每个单词进行翻转 int j ; for(j = 0; j < strlen-1; j++) //最后一个那个' '不用管它 { int start = j;//每个单词的起始位置 int end = j; //每个单词介绍的位置,初始化为j(新单词起始的位置) while(Str[j] != ' '&&Str[j] != ' ' ) //遇到空格或结束符的时候退出,否则继续判断 { end++; j++; } reverse(Str,start, end-1); //对单个字符进行翻转 } } int main() { char sentence[]="I am a student!"; ReverceSentence(sentence); printf("%s",sentence); printf(" "); return 0; }
网上参考答案
#include <iostream> using namespace std; void Reverse(char *start,char *end) //翻转字符串 { if(start==NULL||end==NULL) return; char temp; while(start<end) { temp=*start; *start=*end; *end=temp; start++; end--; } } char *ReverceSentence(char *pstr) { if(pstr==NULL) return NULL; //先将整个句子翻转 char *start=pstr; char *end=pstr+strlen(pstr)-1; Reverse(start,end); start=pstr; end=pstr; //取出一个个单词,翻转之 while(*start!=' ') { if(*start==' ') //单词起始至非空格字符 { start++; end++; continue; } else if(*end==' '||*end==' ') //结束至空格或结束符前一个字符 { Reverse(start,--end); start=++end; } else end++; } return pstr; } int main() { char sentence[]="I am a student!"; char *reverced=ReverceSentence(sentence); cout<<reverced<<endl; system("pause"); return 0; }
/*把给定的字符串的begin到end之间的部分翻转*/ void _reverse(char *str, int begin, int end) { int i = 0; while(i <= (end - begin) / 2) { swap(str[begin + i], str[end - i]); ++i; } }