网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
getchar使用实例:只打印数字字符,跳过其他字符的,代码如下。
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar())!=EOF)
{
if (ch<'0'||ch>'9')
{
continue;
}
putchar(ch);
printf("\n");
}
return 0;
}
💻.2 getchar清理缓存区
看这样一个代码,输入一个密码,然后进行确认密码。
#include<stdio.h>
int main()
{
int password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);//假设密码是abcdef
printf("请确认密码(Y/N):>");
int ret = getchar();
if (ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
看这里的运行结果,还没有输入Y/N进行确认,便已经输出了结果了
这里是因为我们在输入abcdef后,它只是在缓冲区等待进行读取,当我们在键盘上敲入回车后,在缓冲区放入了一个\n,scanf才会进行读取,要注意的是scanf在遇到空白符(如换行、空格等)会结束读取,所以scanf并不会去读取\n,getchar会将缓冲区中的\n读走进行判断结束了程序。
这里在scanf读走字符串后我们需要解决掉这个\n 才可以正常进行确认密码,也就是需要清理缓冲区 。
如果只是要清理上面的问题,我们只需要把缓冲区的\n清理掉即可,做法如下:
#include<stdio.h>
int main()
{
int password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
getchar();//清理\n
printf("请确认密码(Y/N):>");
int ret = getchar();
if (ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
这里在scanf后加了一个getchar,当scanf读取结束后,getchar接着就会把缓冲区的\n清理掉;但这个方法只是可以临时解决问题,存在很大的弊端,看下面这个运行结果
当输入的密码中包含空格,因为scanf遇到空白符会结束读取;而这时scanf后的getchar只能清理一个字符,后面的qwer\n就无法被清理而导致无法正常进行密码的确认,所以说这种方法有时候无法完全清理缓冲区,原因是这里的getcher只能实现一次清理,而如果我们可以实现多次清理就可以解决这个弊端。
下面是优化后的清理缓存区的代码。
将scanf后的getchar换成
while ((ch = getchar()) != ‘\n’)
{
;
}
这条循环语句会让getchar逐个清理缓存区的字符,直到将最后的\n清理掉循环结束.
#include<stdio.h>
int main()
{
int password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
//getchar();
int ch = 0;
while ((ch = getchar()) != '\n')
{
;
}
printf("请确认密码(Y/N):>");
int ret = getchar();
if (ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!