

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
很多时候,我们会写这样的两行代码:
char c;
c = getchar();
这样就很有可能出现问题。
因为**
getchar函数除了返回终端输入的字符外**,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个**EOF在函数库里一般定义为-1**。
因此,在这种情况下,
getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。
二、例题
1.下面用一个题目来看其实如何获取字符和输出字符的
代码示例:
#include <stdio.h>
int main()
{
char c,d,e,f;
printf("please input two characters:\n");
c=getchar();
putchar(c);
putchar('\n');
d=getchar();
putchar(d);
putchar('\n');
e=getchar();
putchar(e);
putchar('\n');
f=getchar();
putchar(f);
putchar('\n');
printf("c= %c\n",c);
printf("d= %c\n",d);
printf("e= %c\n",e);
printf("f= %c\n",f);
}
运行后先输入“12”,回车,再输入“34”,回车。
运行环境是VSCode2019
代码结果:

下面具体解释一下:
- **
getchar函数每次从缓冲区中得到一个字符,putchar**函数每次输出一个字符。- 首先输入了两个字符12,然后回车,注意这时写入缓存中的有3个字符:
1,2,回车。- 程序中有四个
getchar(),于是**c='1',d='2',e='\n'。**- 这时运行到**
f=getchar();输入缓存中的三个字符均被前三个getchar**获取,这时需要用户输入,- 这里输入了34
- 于是**
f='3'**,4和后面的回车没有被利用。- 这便是整个流程。
2.设计一个输入密码的程序
代码示例:
#include <stdio.h>
int main()
{
int password[100] = { 0 };
printf("请输入密码:>");
// 数组名是首元素地址,不用加&
scanf("%d", password);
getchar();
printf("请确认密码(Y/N):>");
char ch = getchar();
if (ch == 'Y')
printf("确认成功\n");
else if (ch == 'N')
printf("确认失败\n");
else
printf("输入错误\n");
return 0;
}
运行结果:

- 这里的**getchar()**就是为了消除缓冲区。你以为到这里就结束了吗?其实还没有…
- 假如现在问题复杂了,有的人可能会把密码输成123 456\n(123和456中间是空格)
我们来看图:

这时候我们可以写一个while循环
#include <stdio.h>
int main()
{
int password[100] = { 0 };
printf("请输入密码:>");
// 数组名是首元素地址,不用加&
scanf("%d", password);
//为了消除\n
while (getchar() != '\n')
{
;
}
printf("请确认密码(Y/N):>");
char ch = getchar();
if (ch == 'Y')
printf("确认成功\n");
else if (ch == 'N')
printf("确认失败\n");
else
printf("输入错误\n");
return 0;
}
代码结果:

总结:
getchar读取了空格、空格是不是都不等于**\n**为真。进入循环后啥也不干,就单纯把它们“吃掉”,最后读取到\n为假。跳出循环。


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
4217

被折叠的 条评论
为什么被折叠?



