转载自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;
}