请看题目:
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
大体思路:
先整体倒置,再倒置单词;
两次倒置的逻辑是相同的;
只是起始(下标)不同。
解题:
由于两次倒置的逻辑相同,这里先写一个倒置函数:
void reverse(char*left,char*right) { while (left<right) { char temp = *left; *left = *right; *right = temp; left++; right--; } }
整体倒置:
给reverse函数传参,这两个参数还是比较好传的
第一个是arr(数组首元素的地址);
另一个是arr+strlen(arr)-1 (数组末尾元素的地址);
单词倒置:
这一部分需要注意的是如何寻找一个单词的首尾
如图所示,我们可以拟两个变量,一个在开头守着,另一个负责寻找结束标识。
这样就相当于把一个单词选定了,把位置传入reverse函数就可以了。
接下来重复上述操作,直到遇到'\0'为止。
char* cur = arr; while (*cur)//当*cur为\0时结束,可作为循环判定标志 { char* start = cur; while (*cur != ' '&&*cur!='\0') { cur++; } reverse(start, cur-1); if(*cur!='\0')//避免跳过\0 导致死循环 cur++; }
最终答案:
#include<stdio.h> #include<string.h>//包含strlen() //字符串倒置 void reverse(char*left,char*right) { while (left<right) { char temp = *left; *left = *right; *right = temp; left++; right--; } } int main() { //输入 char arr[100] = { 0 }; gets(arr);//防止遇到空格停止读取 //整体倒置 reverse(arr,arr+strlen(arr) - 1); //单词倒置 char* cur = arr; while (*cur) { char* start = cur; while (*cur != ' '&&*cur!='\0') { cur++; } reverse(start, cur-1); if(*cur!='\0') cur++; } //输出 printf("%s\n", arr); return 0; }