题目内容
- 牛客网上刷题碰到的:将一句话的单词进行倒置,其中标点符号不倒置.
- 例如输入一句话"I Love Beijing."要求输入为:"Beijing. Love I"
题目分析
刚开始看到这个题目的时候,脑子里没有思路:
1. 如何计算出输入的单词的长度并进行翻转
2.如何将标点符号做到不随单词进行翻转
认真考虑了之后,觉得可以分为以下几个步骤:
- 字符串的整体翻转
将输入的"I Love Beijing.“翻转成”.gnijieB ekiL I" - 单词的逆序翻转
在上步的基础上,将单词进行翻转,".gnijieB ekiL I"翻转成"Beijing. Like I"
代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void reverse(char*left,char*right)
{
char tmp=0;
while(left<right)
{
tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
int main()
{
char arr[100]={0};
//用库函数gets(),获取字符串
gets(arr);
int len=strlen(arr);
//接下来定义一个reverse函数,翻转功能用这个函数实现
//第一步实现字符串的整体翻转
reverse(arr,arr+len-1);
//单词翻转
char*start=arr;
while(*start)
{
char*end=start;
while(*end!' '&&*end!='\0')
{
end++;
}
//识别到' '或者是字符串的终止字符'\0',进行翻转操作
reverse(start,end-1);
if(*end==' ')
start=end+1;
else
start=end;
}
printf("%s\n",arr);
return 0;
}
程序思考
这个代码说难不难,说简单也不是很简单,想在这里跟大家分享一下以下经验:
- 在输入字符串的时候,不能采用scanf输入,要采用库函数中的gets()函数输入
刚开始我在输入一段字符串时,也是采用了scanf()函数进行输入,最后发现结果不对.经过调试发现,scanf()函数在输入时,碰到’ ‘或者是’\0’就停止输入后面的字符了,导致我们在输入"I Love Beijing."时,编译器中只输进去了’I’,结果当然也是错的.
- 在进行单词翻转中,要用if语句判断一下,终止点是’ '还是‘\0’
刚开始,我在最后判断的时候,没有判断最后end是‘ ’还是’\0’,统一将start=end+1,这样就带来了问题:
假如我识别到’\0’,但是我仍然将start置为end+1,将’\0’跳了过去,这样就有可能会导致结果发生错误,所以为了让结果更加严谨,采用下面的这种方式:
if(*end==' ')
start=end+1;
else
start=end;
- 谢谢大家,希望对大家有所帮助!