题目要求:
过程分析:(大致思路)
具体代码:
#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标准下,这个函数因为安全问题已经被废弃,在一些较老的编译器下可能还能使用,但大多编译器已经无法使用,所以这个方法适用范围太窄,建议大家以后不要再使用此函数。