倒置字符串
题目
描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
示例
输入:
I like beijing.
输出:
beijing. like I
解析
首先我们可以逆序整个字符串,然后用一个指针去识别空格,当遇到空格的时候就将前面的字符逆序,遇到’ \0 '就不让指针往后继续走了。
首先先要将字符串装起来,那这里就先用到gets()
int main() {
char str[100] = {
0};
gets(str);
return 0;
}
然后我们要写一个字符串逆序的函数,既可以用来在刚开始逆序整个字符串,也可以在后面用于逆序各个单词
逆序就很简单,设定两个指针从两边往中间靠近并交换,当左指针跑到右指针右边的时候函数停止
void reverse(char* left, char* right) {
while (left < right) {
char tmp = *left;
*left = *right;
*right = tmp;
right--;
left++;
}
}
然后就是逆序整个字符串,我们就用一个strlen()拿到字符串长度,然后再“ -1+数组名 ”就可以拿到指向尾部的指针了
reverse(str, str + len - 1);
然后后面就是我们的一个一个单词的逆序,要逆序一个个单词,首先肯定要找到这些单词
那我们就可以先创建一个指针指向字符串开头,然后让它一直往后走,遇到两种情况做出操作:1.遇到空格 2.遇到’ \0 ’
所以这肯定是一个循环,当指针指向的不是空格或者’ \0 '时,指针就一直+1
char* cur = str;
while ( *cur != ' ' && *cur != '\0') {
cur++;
}
那当这个循环停止的时候,cur肯定已经指向了空格,-1就相当于拿到了右指针。那么这个时候要逆序前面的字符,我们肯定要拿到左指针,所以在开始的时候,我们就可以创建一个指针装开头的位置
然后我们就可以反转一个单词了
char* cur = str;
char* start = cur;
while ( *cur != ' ' && *cur != '\0') {
cur++;
}
reverse(start, cur - 1);
那这个时候,cur还指着那个空格,这时候就让cur++跳过这个空格,指向后面的字母
但是假如说我们找到的不是空格,而是’ \0 ',此时让它跳出就会产生未知的问题,所以我们这还要加一个if条件,让它只在遇到空格的时候++
char* cur = str;
char* start = cur;
while ( *cur != ' ' && *cur != '\0') {
cur++;
}
reverse(start, cur - 1);
if (*cur != '\0')
cur++;
写完上面的,实际上才逆序完一个单词,如果要让他继续往后探索,肯定还要再加一层循环,那么这个循环的条件要怎么写?
这一串代码,肯定要一直走到最后一个单词,那么什么代表我们找到了最后一个单词?
实际上当cur指向’ \0 '的时候,就说明我们已经找到了最后一个单词,那么当这个时候循环就可以结束了,所以我们在外面加一个以这个为条件的while循环即可
char* cur = str;
//我们这个初始化cur的代码只用执行一次,不要把它装到循环里了
while (*cur) {
char* start = cur;
while ( *cur != ' ' && *cur != '\0') {
cur++;
}
reverse(start, cur - 1);
if (*cur != '\0')
cur++;
}
最后只用打印我们处理完的字符串,这个题目就算结束了
代码总览
#include <stdio.h>
void reverse(char* left, char* right) {
while (left < right) {
char tmp = *left;
*left = *right;
*right = tmp;
right--;
left++;
}
}
int main() {
char str[100] = {
0};
gets(str);
int len = strlen(str);
reverse(str, str + len - 1);
char* cur = str;
while (*cur) {
char* start = cur;
while ( *cur != ' ' && *cur != '\0') {
cur++;
}
reverse(start, cur - 1);
if (*cur != '\0')
cur++;
}
printf("%s",str);
return 0;
}