题目要求
将一句话的单词进行倒置,标点不倒置。比如:I Iike beijing. 经过函数后变为 beijing. like l
输入描述:
输入一个仅包含小写字母、空格、‘.’ 的字符串,长度不超过100。
‘.’ 只出现在最后一个单词的末尾。
输出描述:
依次输出倒置之后的字符串,以空格分割。
思路
首先,这道题与字符串逆序打印不同,它相当于以空格为挡板,将空格隔开的几个整体逆序。
如果一个单词逆序两次,那么它将不变。由此,我们可以先将 I Iike beijing. 变为 l ekil .gnijieb ,再将其整体逆序就变为 beijing. like l
实现
首先,我们看要求,输入含空格,那么 scanf 便不能用了(scanf 不能读取空格),我们用 gets 来实现输入。
gets(arr);从标准输入读取字符,并将其作为 C 字符串存储到 arr 中,直到到达换行符或文件末尾。
我们先写 main 函数:
int main() { char arr[101] = { 0 }; //初识化数组为0 gets(arr); char* m = arr; while (*m) //判断地址为 m 的元素是否为0 { char* n = m; //定义一个指针 n 等于 m while (*n != ' '&&*n!='\0') { //找出下一个空格,并把其地址赋给 n n++; } ni_xu(m, n - 1); // n-1 是找出空格前一位字符的地址 //然后将需要逆序的首元素和最后一个元素的地址传入逆序函数。 if (*n != '\n') //判断是否到了字符串末尾 m = n + 1; //将空格后的一个元素改为首元素地址 else m = n; } int len = strlen(arr); //求出字符串长度 ni_xu(arr,arr+len-1 ); //整体逆序 printf("%s\n", arr); return 0; }
当 * n 是 ‘\n’ 时,进入 else ,将首元素地址改为 n ,然后再走一遍循环,你会发现 *m 变为了0,退出循环。
接下来就是逆序字符串函数:
void ni_xu(char* a, char* b) { //假设最左边的地址为a,最右边的为b while (a < b) { char tmp = *a; *a = *b; *b = tmp; a++; b--; } }
将两个函数放一起:
#include<stdio.h> #include<string.h> //使用了 strlen 需包含头文件 void ni_xu(char* a, char* b) { while (a < b) { char tmp = *a; *a = *b; *b = tmp; a++; b--; } } int main() { char arr[101] = { 0 }; gets(arr); char* m = arr; while (*m) { char* n = m; while (*n != ' '&&*n!='\0') { n++; } ni_xu(m, n - 1); if (*n != '\n') m = n + 1; else m = n; } int len = strlen(arr); ni_xu(arr,arr+len-1 ); printf("%s\n", arr); return 0; }
好了,以上便是本题的全部内容,若对您有所帮助还请多多支持哦,若讲解有误还请批评指正,我们下期见~