一文搞清getchar,putchar,gets

	int ch = 0;
	ch = getchar();
	putchar(ch);
  • getchar( ) 表示从键盘接受一个字符放进ch中,注意的是,getchar( )输入字符时需要回车,并且该字符会在屏幕上显示。

  • getch() 表示从键盘上接受一个字符,但是不需要按回车就可以读入,该字符不会在屏幕上显示出来。

  • scanf() 只读取空格之前的东西

  • putchar( ) 表示输出ch

  • **gets()**详见关于gets和scanf的详细描述


循环输入的情况

#include <stdio.h>

int main()
{
	int ch = 0;
	while ((ch = getchar())= EOF)
	{
		putchar(ch);
	}
	return 0;
}

EOF 表示 end of file 即为 -1
当键盘按下Ctrl + Z时,停止循环。


好了,前面都是铺垫,下面举一个栗子。

#include <stdio.h>

int main()
{
	int ret = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确认(y/n):>");
	ret = getchar();
	if (ret == 'y')
		printf("确认成功!");
	else
		printf("放弃确认!");
	return 0;
}

运行结果

请输入密码:>123456
请确认(y/n):>放弃确认!

为什么会这样呢???
.
上面我提到过,getchar( ) 表示从键盘接受一个字符放进ch中。从键盘输入的字符会放在一个输入流区,在scanf()拿了自己想要的东西之后,还剩下什么呢?
.
'\n’不是吗?
在输入完123456之后,我们按下了回车,那么接下来getchar()读取了 ‘\n’ 存放在 ret 中,所以才会出错。
.
那就需要在读取字符放入ret前,我们需要一个getchar()去读取这个换行(哈哈,反正也没有输出~)

#include <stdio.h>

int main()
{
	int ret = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	//缓冲区还剩余一个'\n'
	//读取下一个'\n'
	getchar();
	printf("请确认(y/n):>");
	ret = getchar();
	if (ret == 'y')
		printf("确认成功!");
	else
		printf("放弃确认!");
	return 0;
}

这样就好了嘛?
我们再来输入一组字符串~
输出是这样的

请输入密码:>123456 abc
请确认(y/n):>放弃确认!

因为scanf()只能读取空格之前的东西
所以代码又可以优化

#include <stdio.h>

int main()
{
	int ret = 0;
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");

	while ((ch = getchar()) != '\n')
	{
		ch = getchar();
	}

	printf("请确认(Y/N):>");
	ret = getchar();
	if (ret == 'Y')
		printf("确认成功!");
	else
		printf("放弃确认!");
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JoyCheung-

赏颗糖吃吧~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值