例1
当我们设计一个密码输入系统,在密码输入完成后,并输入Y or N进行确认。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char password[20];
printf("输入密码\n");
scanf("%s", &password);
printf("请确认密码(Y/ N)\n");
char ch = getchar();
if (ch == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
这样的编码乍一看没有任何问题,但是实际运行起来以后会发现,我并没有输入Y or N,系统就自己运行起来了。
这是因为当我们使用scanf或getchar()这样的函数时,在键盘和函数之间存在一个缓冲区,那么当我们在第一次输入完密码时,输入的不仅是密码321还有一个回车键’\n‘。scanf函数读取到321放入passward中,缓冲区里还剩下了一个回车键也就是‘\n’,那么在进行确认判断时,getchar()直接读取缓冲区里面的\n,就会导致程序继续跑起来,给出一个错误的结果。那么我们是否只要把这个\n拿走就可以了呢?只要在进行确认判断的前面加上一个getchar()函数把\n读取掉,那么缓冲区里面就没有任何东西,程序就会等待输入Y or N。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char password[20];
printf("输入密码\n");
scanf("%s", &password);
getchar();
printf("请确认密码(Y/ N)\n");
char ch = getchar();
if (ch == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
现在看起来我们做的已经很完美了,但是事实真的是这样吗,如果当我输入的密码里面存在空格的话,又会是什么情况呢?
我们可以看到在这里又出现了上面的情况,可是缓冲区里面的\n不是应该被getchar()读取了吗。这是因为scanf函数在读取字符串时遇到空格就会不在进行读取。那么就导致缓冲区里剩下了‘ as3’,而getchar()函数一次只能读取一个字符,这时候我们就应该用一个循环把缓冲区清除。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char password[20];
printf("输入密码\n");
scanf("%s", &password);
getchar();
printf("请确认密码(Y/ N)\n");
char ch = 0;
while ((ch = getchar()) != '\n')
;
if (ch == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
通过一个while循环加一个空语句,它的意思是如果getchar读取到的字符不是'\n',就让getchar函数继续读取缓冲区,直到读取到\n为止,那么此时的缓冲区也就清除干净了。
空语句
空语句不同于表达式语句、函数调用语句等功能性语句,它什么都不需要做,但是有时候我们需要一条空语句。就像这里,我们需要的是while函数,但是如果没有空语句的话while函数只能够运行一次。
例2
判断输入的字符是不是字母,请编程实现。
输入描述
多组输入,每一行输入一个字符。
输出描述:
针对每组输入,输出单独占一行,判断输入字符是否为字母,输出内容详见输出样例。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char ch;
while (scanf("%c", &ch) == 1)
{
if (ch > 64 && ch < 91)//或者写ch>'A'&&ch<'Z'
{
printf("%c is an alphabet.\n", ch);
}
else if (ch > 96 && ch < 123)
{
printf("%c is an alphabet.\n", ch);
}
else
printf("%c is not an alphabet.\n", ch);
getchar();
}
return 0;
}
像这里的getchar就是读取\n的作用。
而如果没有getchar函数读取缓冲区的话,输出的结果就是这样的
因为处在while循环中,scanf函数会读取两次,第一次是输入的字符,第二次就是\n,就会导致输出错误。
结语
当我们遇到一些问题的时候,可以多从计算机的角度出发,去分析每一个语句产生的效果,从而找到解决问题的最优途径。心若不欺,必然扬眉吐气。遇到问题不要屈服,努力地去克服它,终会有扬眉吐气的一刻。
码字不易,喜欢就给个一键三连叭。如有错漏之处还请多多指正。