目录
题目:
我最近在刷题的时候碰到了这道题,短时间内很难想到此思路,下面分享给大家!!!
将字符串 ‘I like study C.’逆置为‘C. study like I’
解题思路:
通过观察发现本题与普通的字符串逆置有些不同,普通情况下字符串会逆置为
“.C yduts ekil I”;本题目需要在此基础上,再进行一次逆置
图解:
搞懂思路之后,我们来编写一下代码!!!
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
void swap(char* left, char* right) {
assert(left);//断言保证不是空指针
assert(right);
while (left < right) {
char* temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int main() {
char a[101] = "I like study C.";
gets(a);//读取字符换
//开始处理
char* arr = a;//找到字符串起始位置
while (*arr) {//对数组名解引用,如果不等于“\0”,继续遍历
char* low = arr;
char* high = arr;
//以空格和‘\0’为控制条件循环处理
while (*high != ' ' && *high != '\0') {
high++;
}
swap(low, high - 1);//单词处理
if (*high != '\0')
arr = high + 1;//上一个字符串末尾下标+1,指向新的字符串起始位置
else
arr = high;//如果是字符串末尾,则high不用+1
}
//逆置整个字符串
int len = strlen(a);
swap(a, a + len - 1);
printf("%s\n", a);
return 0;
}
代码解读:
采用双指针,从数组首地址开始遍历整个数组,当遇到空格的时候完成一个单词的遍历,进行单词的逆置;当解决完一个单词之后,需要给指针(当指针指向空格的时候停止循环)+1,直到遇见字符串结束标志‘\0’,完成遍历
至此本题完成!!!
下面附带一份来自lao的代码,此代码略有问题,仅供参考
void fun() {
char arr[101];
if (scanf("%s",arr) != EOF) {
fun();
printf("%s",arr);
}
}
int main() {
fun();
return 0;
}
此代码也可解决问题,采用递归,依次读取每个单词存储起来,当读取完毕的时候,先开始打印最后一个单词,然后回推打印前面的单词。
感谢阅读此篇博客,如果对你有帮助,欢迎点赞评论;如有问题欢迎指正;如需转载,请标明出处!!!