将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
依次输出倒置之后的字符串,以空格分割
输入:
I like beijing.
输出:
beijing. like I
1.首先将输入的整个字符串逆序。
2.逆序字符串中每个的单词,注意的是单词间以 ’ '(空格)或者 ‘\0’(字符串结束标识)。
#include
#include
#include
//逆序函数
void Reverse(char* left, char* right)
{
assert(left && right);
while(left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char str[100] = {0};
//输入
gets(str);
int len = strlen(str);
//逆序整个字符串
Reverse(str,str+len-1);
char* cur = str;//cur指针存放需要逆序字符串的结尾地址
while(*cur)//当cur指针指向的内容不为\0则循环
{
char*start = cur;//记录逆序字符串的起始地址
//根据题意可知,单词的分割是以' '(空格)或者'\0'(字符串结束标志)
while(*cur != ' ' && *cur != '\0')//判断指针是否指向字符串结束地址
{
cur++;
}
Reverse(start,cur-1);//逆序单词
if(*cur == '')//当指向\0时,不再继续逆序单词
cur++;
}
printf("%s\n",str);//输出逆置后的字符串
return 0;
}
1.首先,需要理解通过指针操作逆序整个字符串。已知数组名为字符串首元素的地址。那么字符串结束的地址怎么求呢?需要通过求出字符串长度后,根据首元素+字符串长度-1后,便可以的到字符串结束的地址。逆序函数的两个参数,我们分别用字符串的首元素地址和字符串结束地址。根据创建临时变量,交换两个变量的值。每次交换后移动指针,便可以完成整个完成字符串的逆序函数的定义。
2.逆序整个字符串后,分别逆序每个单词,根据题意,‘ '(空格)和 ‘\0’(字符串结束标识)分割每个单词。所以,创建两个指针变量,分别指向单词首元素地址和单词末尾元素地址。单词首元素地址为逆序后字符串的首元素地址,单词末尾元素地址可以通过 ’ ‘或’\0’的地址 - 1 的方法来得到。当完成一个单词逆序后,需要将原本指向末尾元素的指针+1,从而获取下一个单词的首元素地址。进而重复以上步骤,直到指向末尾元素的指针指向字符串结束的标识 ‘\0’。