首先写一段代码,这个代码是输入一个公司职员的公司编号,然后要求公司职员再次确认自己的编号是否正确,如果正确则确认成功,如果不正确则重新输入(有点像再次输入密码那样的)。
#include<stdio.h>
int TF(char x)
{
char n[40] = {0};
int R1 = 0;
int c = 0;
if(x == 'T')
{
printf("编号已确认\n");
}
else
{
printf("编号未确认,需要重新输入编号\n");
printf("需要重新输入编号:");
scanf("%s",n);
getchar();
printf("请再次确认您的编号:(T/F)");
c = getchar();
R1 = TF(c);
getchar();
}
return 0;
}
int main()
{
int a = 0;
int R2 = 0;
char number[40] = {0};
printf("请输入您的公司职员编号:");
scanf("%s",number);
getchar();//应当在scanf的后面去加这个空的getchar;
printf("请输入'T'or'F'来确认您的编号:");
a = getchar();
R2 = TF(a);
return 0;
}
(代码很简单的利用了一下函数,主要是去说明getchar的回车-缓冲区的问题)
在《C程序设计》(谭浩强著)上有依次输入‘B','O','Y'三个字符的例题以及说明,也就是scanf和getchar这类输入函数在你输入某些东西的时候会自动检测出一片区域,该区域即输入缓冲区。以上述代码为例,如果"scanf("%s",number)"后没有"getchar();",在主函数中当我们依次输入‘012345’的时候,回车键键入之时,会出现这种情况:
可以看到,此时的编译器会直接输出“未确认”,这就是getchar等输入函数的原因了。
刚开始什么都没有输入的时候,输入缓冲区内什么也没,但当我们输入“012345”进去的时候,此时输入缓冲区内就有了一个虚拟的“012345”,我们这时按回车键想要往下走代码,但是回车键也会以'\n'的形式和‘012345’一起储存到输入缓冲区中。当我们要用的时候,以上述代码为例,scanf会取走空格或回车前的字符串即‘012345’,剩下一个‘\n‘,若此时不取走它,即没有getchar(),在上述的TF函数中,就会默认将这个‘\n‘输入到了判断中,即不会走if语句而是走了else语句,成功走向了深渊。
所以可以看到,我们需要一个空的getchar()去存放这个‘\n‘,以达到我们理想的目的。
但是从百度以及以前学过的经验得知,一串数字并不是字符串,“数字也是以字符串的形式来展现的”,所以当我们输入123W345的时候,也是会出现错误,更别提其中有空格如12457W 908这样的情况了,所以我们应该去改进--利用while循环(此处感谢b站比特鹏哥的解说,也算是一个笔记,如有侵权请告知)
我们在上述代码中的scanf后加一个while循环,当检测到\n时才会进行循环外的操作,具体代码可以改进为:
#include<stdio.h>
int TF(char x)
{
char n[40] = {0};
int gh = 0;
int R1 = 0;
int c = 0;
if(x == 'T')
{
printf("编号已确认\n");
}
else
{
printf("编号未确认,需要重新输入编号\n");
printf("需要重新输入编号:");
scanf("%s",n);
while((gh = getchar()) != '\n')
{
;
}
printf("请再次确认您的编号:(T/F)");
c = getchar();
R1 = TF(c);
getchar();
}
return 0;
}
int main()
{
int a = 0;
int R2 = 0;
int ch = 0;
char number[40] = {0};
printf("请输入您的公司职员编号:");
scanf("%s",number);
while((ch = getchar()) != '\n')
{
;//一个分号代表空语句,什么也不做
//也就是找到了一个ch去循环不进行任何操作的处理‘\n‘前的数据
}
//应当在scanf的后面去加这个空的getchar;
printf("请输入'T'or'F'来确认您的编号:");
a = getchar();
R2 = TF(a);
return 0;
}
此时这个代码就写的差不多了。。。
ps:作者目前还处于C语言小白阶段,如有写的不对的地方还望指正。