getchar、putchar以及输入缓冲区

目录

1.getchar和putchar的文献

1.1关于getchar的文献:

1.2关于putchar的文献

1.3返回值问题

2.从键盘中输入一个字符

2.1原理💨

🚩2.2如何理解:

❗理解1:

❗理解2:

2.3关于程序如何结束

3.输入密码

3.1调用一次getchar读取相当于"吸收掉该字符"1️⃣

3.2多个字符且字符之间有空格2️⃣

3.3关于scanf的读取问题3️⃣

4.ASCLL码表

4.1只打印数字字符的代码:

4.2图解(也可以作为查找)


前言:

        我们知道输入输出函数有scanf/printf。除此之外,还有getchar、putchar等函数,那今天这篇文章就开始记录这两个函数的功能和用途。

1.getchar和putchar的文献

1.1关于getchar的文献:

getchar - 读取一个字符

翻译: 

1.2关于putchar的文献

putchar - 输出/打印一个字符

翻译:

1.3返回值问题

因为:读取到字符的时候返回的是字符的ASCII码值,取值范围:ASCII:0~127

但如果读取失败,则返回的是EOF ---> -1 

2.从键盘中输入一个字符

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

	return 0;
}

按F5执行,光标闪烁,说明在等待,要你输入东西。

2.1原理💨

getchar和scanf是用来输入数据的,那直接是从键盘上拿吗?不是。

🚩2.2如何理解:

❗理解1:

实际上,在键盘和各输入函数之间是有一个输入缓冲区的,在键盘上输入字符‘A’的时候,这时候键盘输入的‘A’还没到缓冲区,只有当按下回车的时候,那就触发了条件,同时也放了'\n'到缓冲区,对于getchar这个函数来说一次读一个字符,就读取走了'A',因为是while循环,所以第二次进入循环的时候, 会把'\n'读取进去

所以putchar输出的时候,'\n'造成的换行效果导致光标在第二行闪烁(红色箭头

注意这里:putchar是输出,getchar是读取

❗理解2:

以下仅限于getchar函数

可以理解成两个缓冲区,字符输入的时候一个键盘缓冲区,会把输入东西放进键盘缓冲区,然后按下回车(enter)之后会有一个输入缓冲区,之后这个getchar函数从输入缓冲区里面读取数据,是这样的一个过程

关于理解1和理解2

就是一个理解上的一个差异而言,实质上没什么区别。

2.3关于程序如何结束

 注意:键盘shift+6^+Z,这样是不能让程序停下来

需要:ctrl+Z,小写大写都无所谓的,都会转成Z

3.输入密码

预测的可能结果:printf("请输入密码:>");之后输入字符,输入完之后,

打印printf("请输入密码(Y/N):>");之后选择输入'Y'或者非'Y'的字符,打印确认成功或者确认失败

#include<stdio.h>
int main()
{
	printf("请输入密码:>");
	char password[20] = { 0 };
	scanf("%s", password);
	printf("请输入密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

可是事实上却是:

原因:

还有个疑问就是:为什么scanf不读取'\n'?回车是为了按,为了触发,为了把在控制台输入的东西,放到缓冲区里面,让scanf去读取,才按的回车,回车不是密码的内容

'\n'--回车都是密码吗?不是


 

3.1调用一次getchar读取相当于"吸收掉该字符"1️⃣

修改:

int main()
{
    printf("请输入密码:>");
    char password[20] = { 0 };
    scanf("%s", password);
    getchar();//处理'\n' -->加上这个位置才不会让程序发生错误
    printf("请输入密码(Y/N):>");
    int ch = getchar();
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

确认成功:

确认失败:

3.2多个字符且字符之间有空格2️⃣

注意:“回车”和空格也是字符

同样是上面修改之后的程序,输入以下字符串,会发生错误

int main()
{
    printf("请输入密码:>");
    char password[20] = { 0 };
    scanf("%s", password);
    getchar();//处理'\n' -->加上这个位置才不会让程序发生错误
    printf("请输入密码(Y/N):>");
    int ch = getchar();
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

原因:

修改:

#include<stdio.h>
int main()
{
	printf("请输入密码:>");
	char password[20] = { 0 };
	scanf("%s", password);
	//清理缓冲区
	while (getchar() != '\n')//读取了也不用,不接受返回值,不存储元素,只是让它清理一下
	{
		;
	}
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;
}

注意:

while (getchar() != '\n') 这个位置可以换成其它字符,意思是读到这个元素就不读取了

 

3.3关于scanf的读取问题3️⃣

scanf默认是读取到空格就结束了

#include<stdio.h>
int main()
{
	char arr[20] = {0};
	scanf("%s", arr);
	printf("%s\n", arr);

	return 0;
}

执行: 

 

但是如果写成这样:

意思是一直往后面读取,直到遇到'\n',

#include<stdio.h>
int main()
{
    char arr[20] = {0};
    scanf("%[^\n]", arr);//[^]这里面可以换成其它字符,但是换的那个最终要在缓冲区那里得放                                    //进去那个字符,'\0'就挺难的

    return 0;
}
 

 执行:

 

4.ASCLL码表

4.1只打印数字字符的代码:

#include <stdio.h>
int main()
{
    char ch = '\0';
 while ((ch = getchar()) != EOF)
 {
     if (ch < '0'|| ch > '9')//这段代码的意思是在这个范围内的都不打印
        continue;
     putchar(ch);
 }
 return 0;
}

输出: 

注意这里:

\0读取的时候把'\'输出跳过,然后直接输出'0'

控制台的每一个输入都是字符,只是看它是什么类型

这里有的是数字类型的字符,其实就是数字的意思

4.2图解(也可以作为查找)

只打印红色框里面的字符

 这个表也可以供参考使用。欢迎大佬补充!

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dream_Chaser~

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值