题目要求:
过程分析:(大致思路)
具体代码:
#include <stdio.h> #include <string.h> /*逆序字符串*/ void reverse(char* begin,char* end) { while (begin < end) { char temp = *begin; *begin = *end; *end = temp; begin++; end--; } } int main() { char arr[101]; fgets(arr, 101, stdin); int len = strlen(arr); arr[len - 1] = '\0';//注意,fgets函数在读取时会把\n也存到字符串中 //要把最后一个字符改为\0 /*实现倒置字符串*/ reverse(arr, arr + len - 2); /*实现每个单词的逆序*/ char* start = arr;//存储每个单词的首地址 char* cur = arr;//用于存储当前的地址 while (*cur) { while (*cur != ' ' && *cur!='\0') { cur++;//最后cur会指向空格(最后一个单词会指向\0) } reverse(start, cur - 1); start = cur + 1; if (*cur == ' ')//若*cur在等于\0之后再++,他会指向一个随机值,从而使循环继续 { cur++;//使其指向下一个单词的首地址 } } printf("%s", arr); return 0; }
注意:本题作者在一开始使用了scanf函数来读取字符串,忘记了scanf函数读取到空格就会自动结束读取字符串了,导致接下来如何编写都无法得到正确答案,吃了基础不牢的亏,希望大家引以为鉴;
那么,在无法使用scanf函数来读取含有空格的字符串的情况下,我们又可以使用哪些方法呢?下面作者将讲述三个方法;
1.fgets函数(重点讲解)
原型:
观察fgets函数,我们可知他与scanf函数最大的不同在于fgets函数会将字符串的结束标志'\0'也作为一个元素存储到数组str中!在倒置字符串的代码中,就有对这一情况的一个解决方案。
2.使用scanf("%[^\n]s", arr)函数
可以理解为是scanf函数的一个优化版本,使scanf能够读取含有空格的字符串。
在倒置字符串代码中使用scanf("%[^\n]s",arr);函数
3.gets或gets_s函数
很多人的第一想法可能是gets函数,因为这是我们在初学C语言时经常用到的函数,可在C99标准下,这个函数因为安全问题已经被废弃,在一些较老的编译器下可能还能使用,但大多编译器已经无法使用,所以这个方法适用范围太窄,建议大家以后不要再使用此函数。