C语言gets()与scanf()

先列举几种情况,以下的代码只有输入方式有变化:
1.

#include<string>
#include<math.h>

using namespace std;

int main()
{
    char m[33];
    char n[33];
    gets(n);
    gets(m);
    printf("%s",m);//正常输出
    return 0;

}

2.

#include<string>
#include<math.h>

using namespace std;

int main()
{
    char m[33];
    char n[33];
    scanf("%s",n);
    gets(m);
    printf("%s",m);//输出为空
    return 0;

}

3.

#include<string>
#include<math.h>

using namespace std;

int main()
{
    char m[33];
    char n[33];
    scanf("%s",n);
    scanf("%s",m);
    printf("%s",m);//正常输出
    return 0;

}

3.

#include<string>
#include<math.h>

using namespace std;

int main()
{
    char m[33];
    char n[33];
    gets(n);
    scanf("%s",m);
    printf("%s",m);//正常输出
    return 0;

}

总结:
1. scanf以空格,回车,tab为输出结束标志,只读取结束标志之前的字符,所以结束标志仍然留在缓冲区内。
2. gets只以回车为结束标志,读取结束标志以及之前的字符,那么结束标志就不会留在缓冲区内(即吸收了缓冲区内的结束标志),但读取之后gets会把回车符换成’\0’。

所以,第一种情况,第一个回车符没有留在缓冲区内,所以第二次输入正常读取;
第二种情况,回车符留在了缓冲区内,第二次输入gets读取到了一个回车符即以为输入结束,然后再把回车符换成’\0’,所以读取到一个空字符串。
第三种和第四种情况,不管回车符在不在缓冲区内,scanf都不会读取,所以scanf读取正常,输出正常。
tips:cin和scanf很相似,所以当用c++风格的方式输入字符串时,可把cin理解为scanf,各种处理方式也相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值