#include<string.h>
#include<stdio.h>
#include<assert.h>
int my_strlen(char* arr )//求字符串长度,不带最后一个句号,也可以使用库函数strlen求得后减一
{
assert(arr != NULL);//断言,将空指针排除,防止程序崩溃
int count = 0;
while (*arr != '\0' && *arr != '.')
{
arr++;
count++;
}
return count;
}
void reverstr(char* arr, int sz)//将整个句子逆序
{
int left = 0;
int right = sz - 1;//双指针,遍历整个字符串
char tmp = 0;
while (right - left > 0)//逆序字符串,一个一个字母交换
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
void reverword(char* arr, int left, int right)
//逆序单词,逆序字符串时,单词也被逆序,这里将单词逆序得到正序的单词
{
char tmp = 0;
while (right - left > 0)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr1[] = "I like Beijing.";
int size = my_strlen(arr1);//求字符串长度
reverstr(arr1, size);//逆序字符串
int left = 0;
int right = 0;//仍然采用双指针(快慢指针),找到每个单词在数组中的起始和结束字母对应的下标
while (arr1[right] != '.')
{
while (arr1[right] != ' '&&arr1[right]!='.')
//找结束字母下标,最终得到的是' ',也就是结束字母下标加一
{
right++;
}
reverword(arr1,left, right-1);//故这里的右下标要减一
if (arr1[right] != '.')
//之所以要判断是否为'.',是为了防止死循环的出现,即如果不判断而直接进行++,当最后一个单词判断完后就会跳过'.',大家可 以调试一下,一看便知
left = ++right;
else
break;
}
printf("%s", arr1);
return 0;
}
//初次写博客,不妥之处请大家多多指正