请看题目:
将一句话的单词进行倒置,标点不倒置。比如 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;
}
如果你觉得这篇文章还不错并且对你有帮助的话,欢迎三连!!!