getchar()的使用和妙用

        getchar是c语言的一个读取函数,与scanf不同,它只能用于读取一个字符,而scanf却可以读取整数、小数、字符、字符串等。下面我们通过一串代码来认识一下它

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 30;
	int b = 40;
	int ch = getchar();
	switch (ch)
	{
	case '*':
		printf("%d", a * b);
		break;
	case '/':
		printf("%d", a / b);
		break;
	case '+':
		printf("%d", a + b);
		break;
	case '-':
		printf("%d", a - b);
		break;
	}
	
	return 0;
}

        上述代码是使用getchar()设计的一个简易计算器,getchar()用于读取一个符号并储存至ch中(至于存储的类型为什么为int这是因为计算机存储的并不是这个符号本身而是它的ASCLL码值)。

        下面我们再通过一串代码来多次实现字符的输入和输出:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int ch = 0;
	while ((ch=getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

        这里我们使用putchar实现字符的输出,在while循环中嵌套getchar语句实现无限输入(注意:这里的EOF是读取失败的意思,在代码运行时使用ctrl+Z即可使getchar()读取失败,跳出循环)。

        我们再来通过一串代码的改进,来认识getchar()的妙用。下面是一串输入并确认密码的代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char s[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", s);				//数组的赋值不需要&
	printf("请确认密码Y/N\n");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功");
	}
	else
		printf("确认失败");

	
	return 0;
}

        可以看到运行的结果并不理想,这是为什么呢?这是因为scanf和getchar并不是从键盘上直接读取数值,而是要通过一个缓冲区进行读取-----键盘输入的内容进入缓冲区,然后getchar和scanf再读取里面的内容,而上述代码中,scanf读取了字符串1321312,而缓冲区中剩下了\n被getchar读取,因此显示确认失败。

        那么如何改进这串代码呢,有的同学就会说那我们再添加一个getchar把换行符读走不就好了吗?那么又会出现新的问题下面让我们来看一看,这是改进后的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char s[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", s);				//数组的赋值不需要&
	getchar();					//读取\n
	printf("请确认密码Y/N\n");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功");
	}
	else
		printf("确认失败");

	
	return 0;
}

        可以看到如果我们只输入字符串形式的密码,代码已经能够成功运行了。那么我们如果在中间穿插其它字符(这里使用空格举例),运行结果又会发生什么变化呢?

        可以看到和第一个程序发生了同样的错误,这是因为空格结束了scanf语句,而getchar将abc读取走了。那么如何在每一次输入时清空缓冲区呢?我们来看下面这串代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char s[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", s);				//数组的赋值不需要&
	//清理缓冲区
	while (getchar() != '\n')			//\n
	{
		;
	}
	printf("请确认密码Y/N\n");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功");
	}
	else
		printf("确认失败");

	
	return 0;
}

        可以看到无论我怎么使用空格或字符,程序都不会错误,这是因为我们使用了while循环来清空缓冲区,只要getchar读取不到\n就一直循环直到\n出现才会执行下一步程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值