一,题目要求
题目描述:将一句话的单词进行倒置,标点不倒置。比如 "I like beijing.",经过处理后变为:"beijing. like I"。 字符串长度不超过100。
输入描述:输入一个仅包含小写字母、空格、'.' 的字符串,长度不超过100。 '.' 只出现在最后一个单词的末尾。
输出描述:依次输出倒置之后的字符串,以空格分割。 补充说明:
示例:输入:I like beijing. 输出:beijing. like I
二,解题思路
逆序整个字符串 ,再逆序每个单词。
代码实现:
void reverse(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[101];
/*scanf("%s", arr);
printf("%s", arr);
scanf遇到空格就不能接收了*/
gets(arr); //读取一个字符串,即使有空格
int len = strlen(arr);
reverse(arr, arr + len - 1);
char* start = arr;
char* cur = arr;
while (*cur)
{
while (*cur != '\0' && *cur != ' ')
{
cur++;
}
reverse(start, cur - 1);
start = cur + 1;
if (*cur == ' ')
cur++;
}
printf("%s", arr);
return 0;
}
1. 首先定义一个字符数组arr, 用gets库函数读取一个字符串存入arr中。
2. 逆序整个字符串:定义一个reverse函数,参数是一个是数组首元素地址,另一个是数组最后一个元素地址,可以用首地址+长度-1计算得来。写一个while循环,当左边小于右边地址时,交换左右两边地址所指的值,直到不满足条件。
3. 逆序每一个单词:首先定义两个指针cur和start指向首元素,考虑内层循环,当cur所指向的元素不是\0或者空格时,cur向后移动一次。直到cur指向空格,此时便用reverse函数逆序这个单词。逆序之后,start=cur+1。即指向了下一个单词的首字母,如果cur指向的是空格,cur++,cur就和start一样。同样指向下一个单词的首字母。这样就实现了一个单词的逆序。而外层循环,如果cur没有指向\0,继续循环,这样就实现了多个单词的逆序,直到遇到\0,结束循环。
这样就实现了字符串单词的逆序。
图示:
结果如下: