牛客网学习之倒置字符串(详解fgets函数,如何读取含有空格的字符串)

题目要求:

 过程分析:(大致思路)

 具体代码:

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

猜你喜欢

转载自blog.csdn.net/Mylvzi/article/details/130875905