题目:
逆置字符串中的单词,标点符号不逆置。比如字符串“I like Beijing.”,逆置后结果为“Beijing. like I”
解决思路:
(1)我们可以将整个字符串先逆置得到“.gnijieB ekil I”,在逆置每个单词得到“Beijing like I”。当然也可以先逆置单词在逆置整个字符串;
(2)逆置的实现,我们可以定义首尾指针,两两交换,然后首指针++,尾指针--;
(3)每个单词的逆置,以空格为结束标记,整个字符串以‘\0’为结束标记;
(4)标点符号不逆置,只要将它算在单词的一部分即可实现。
实现代码:
#include<stdio.h>
#include<string.h>
void reverse(char* ch, int n)//逆置从数组ch地址开始的n个字符
{
int i;
char temp;
for (i = 0; i<n / 2; i++)
{
temp = ch[i];
ch[i] = ch[n - 1 - i];
ch[n - 1 - i] = temp;
}
}
void ReverseSentence(char* ch)//先逆序整体,再进行单词逆序
{
int i = 0;
int len;
len = strlen(ch);
reverse(ch, len);//将字符串全部逆置
while (ch[i] != '\0')
{
i = 0;
while (ch[i] != ' ' && ch[i] != '\0')//若当前字符不为空格,指针后移
{
i++;
}
reverse(ch, i);//字符串ch中i个字符进行逆置
if (ch[i] != '\0')//如果没有访问到结束标志,要跳过空格字符,继续访问下个单词
ch = ch + i + 1;
else//如果当前字符已经是结束标志了,加一即可,若像跳过空格,可能会直接跳过结束标志
ch = ch + i;
}
}
int main()
{
char str[] = "i am Sundy, i come from tianjin.,";
printf("%s\n", str);
ReverseSentence(str);
printf("%s\n", str);
system("pause");
return 0;
}