目录
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图解(也可以作为查找)
只打印红色框里面的字符
这个表也可以供参考使用。欢迎大佬补充!