转载自https://blog.csdn.net/ReaF_star/article/details/85064010?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161093836216780264057204%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161093836216780264057204&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-85064010.first_rank_v2_pc_rank_v29&utm_term=gets%E6%9C%80%E5%90%8E%E8%BE%93%E5%85%A5%E7%9A%84%E5%9B%9E%E8%BD%A6%E7%AC%A6%E6%80%8E%E4%B9%88%E6%8A%8A

先看下代码以及运行结果(这代码从网上拷的)

#include <stdio.h>

int main()
{
// 先读入一个整数,再读入2个串
int a;
char b1[100];
char b2[100];

scanf("%d", &a);
gets(b1);
gets(b2);

printf("a = %d\n", a);
printf("b1 = %s\n", b1);
printf("b2 = %s\n", b2);

return 0;

}

这是使用gets函数的运行结果:

在这里插入图片描述

改成scanf函数试试

scanf("%d", &a);
scanf("%s",b1);
scanf("%s",b2);
在这里插入图片描述

从两个运行结果来看,gets函数会读取换行符,但是读取了换行符了就不会读取后面的数据;记住,当我们输入回车键的时候其实是输入了换行回车两个字符进去的,记住是先输入回车字符后输入换行字符,但是gets函数并不接受回车字符,把它当作结束符,即遇到回车就读取之前的数据,那么后面的换行符并没有读取,这就导致后面使用的gets函数会读取到换行符,读取到了换行符就不会读取后面的字符,且把它转换为终止符。scanf函数就不会出现这种情况。

也就是说使用gets函数得注意输入换行符的问题,一般使用getchar接受换行符,有许多人可能为问到既然scanf不会出现这种问题为什么不使用scanf函数,这里有两个原因:

1使用gets函数更加简单对于字符串输入来说;

2scanf不能接受空格,sanf把空格当成结束符,一般遇到有空格的字符串得使用gets函数接受读取,gets函数可以接收有空格的字符串。

总而言之,使用C语言里的gets得注意换行符的接收,scanf函数不能接收带空格的字符串。

疑问:
如果把char数组类型换成string类型为为啥不行了

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std; 
int main()
{
	int a;
	string b,c;
	scanf("%d",&a);
	scanf("%s",&b);
	scanf("%s",&c);
	
	cout<<a<<endl;
	cout<<b<<endl;
	cout<<c<<enl
	return 0;
 } 
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐