C语言GETS函数和Scanf函数在终止输入时的区别

首先我们来看一个例子,代码如下:

int main()
{
    char str[50],ch1[50];

    scanf("%s",ch1);
    gets(str);
    printf("ch1的值为:");
    puts(ch1);
    printf("str的值为:");
    puts(str);
    printf("输出完毕\n");

    return 0;
}

代码很简单就是分别输入两个字符串然后分别输出。但如果我们只输入hello,然后就回车,就会发现程序结束,输出结果如下:
在这里插入图片描述
从输出结果我们可以看出,scanf函数接收的输入值为hello,gets函数接收的输入值为空(注意gets函数的输入值不是回车换行,因为puts函数会自带一个回车换行),这是为什么呢?我的本意是换行后接着输入第二个字符串,怎么就结束了。

下面我们梳理一下这个输入的流程就应该明白了为什么会导致这个结果。首先我们在终端输入字符时,这些字符是保存到缓冲区的,然后在我们按下回车时字符才进入标准输入流中,等待scanfgets这些输入函数读取,并且回车换行符也进入了标准输入流中。首先就是scanf函数读取字符,scanf函数遇见空格、制表符以及换行符这些空白字符时就会结束读取,所以scanf函数在读到换行符时就认为输入结束,换行符继续留在标准输入流中,故它的输入值为hello。然后就是gets函数开始执行,gets函数发现标准输入流中还有未读取的字符,故继续在标准输入流中读取字符,但它读到的第一个字符就是回车换行符,而gets函数输入结束的标志就是回车换行符,所以它在读第一个字符时就停止读取,函数结束返回,故它的输入值为空。并且gets函数会将标准输入流清空。再次调用输入函数,需要在终端重新输入。

总结一下,造成这样的原因就在于scanf函数的输入结束符是空白字符,也就是空格、制表符、和换行符这些,而gets函数的输入结束符是回车换行符。因为gets函数所读取的第一个字符就是回车换行符,所以gets函数的输入内容为空。

另外值得注意的就是用scanf函数输入字符串时,它是从第一个非空白字符开始读取,而gets函数无这个特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值