题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字符一样处理。例如输入字符串”I am a student.” 翻转后为”student. a am I”
方法:第一步翻转句子中的所有字符;第二步再翻转每个单词的顺序。
注意一个问题:
char *str = “abc”,这个时候字符串”abc”是存储在常量区,所以这个时候字符指针不能对字符串常量做任何的修改
char str[] = “abc”,这个时候字符串存储在字符数数组中,不再是常量所以字符指针可以对字符数组进行修改
/*
注意
1. char *p = "abc",这个时候字符串"abc"为字符串常量不允许修改
2. 如果我们要翻转字符串必须把字符串存储到字符数组中
char string[] = "abc",这个时候abc就不是字符串常量了可以修改
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
//翻转单词
void ReverseWord(char *begin, char *end){
if(begin == NULL || end == NULL){
return;
}
//翻转
while(begin < end){
swap(*begin, *end);//交换两个位置的字符
++begin;
--end;
}
}
//翻转字符串句子
char *ReverseString(char *string){
if(string == NULL){ //空字符串
return NULL;
}
//设置两个指针一个指向首地址一个指向最末尾
int len = (int)strlen(string);
char *begin = string;
char *end = string+len-1;
//翻转整个字符串
ReverseWord(begin, end);
//翻转单词
begin = string;
end = string;
//枚举字符串句子把单词翻转过来
while(*end != '\0'){
//如果碰到了空格就把前面的单词翻转
if(*end == ' '){
ReverseWord(begin, end-1); //注意这边是end-1
++end;
begin = end;
}
else {
end++;
}
}
//最后把剩下的也翻转了
ReverseWord(begin, end-1);
return string;
}
版权声明:本文为cgl1079743846原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。