首先getchar的数据类型是整型,可以理解为字母对应的ASCII码;
int ch;
while((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
当在运行上面这段代码时发现,每次输出时他都会自动换行,那么为什么会出现这种现象呢。比如输入的字符串是a,在输入的同时会按下回车键,此时程序会将字符a以及\n存储到输入缓冲区中,当getchar函数看到输入缓冲区中有东西,那么他就会开始读入,第一次循环读入a,第二次循环读入\n,通过putchar函数输出后就会出现换行的情况。
利用这个性质来解决一下下面这个问题
char password[10]={0};
printf("请输入密码:>");
scanf("%s",password);
printf("请确认密码(Y/N):>");
int a = getchar();
if(a == 'Y')
printf("Yes");
else
printf("No");
return 0;
在输入密码以及回车之后程序便停止运行
其原因就是因为我们输入完密码的同时按下了回车,此时输入缓冲区中存放的是密码加上\n,而scanf函数只能读取缓冲区中的密码,此时缓冲区中还剩下\n,直接被getchar()读取,显然if语句的条件不成,因此输出No;
为了解决这种情况,我们可以想办法在scanf函数读取完输入缓冲区中的密码后,将剩下的\n清空,因此可以进行以下操作
char password[10]={0};
printf("请输入密码:>");
scanf("%s",password);
getchar();
printf("请确认密码(Y/N):>");
int a = getchar();
if(a == 'Y')
printf("Yes");
else
printf("No");
return 0;
通过getchar(),读取到输入缓冲区中的\n,间接清空了输入缓冲区,便能正常运行
当然上述代码仍然存在一定问题,比如当输入中带有空格时,比如输入为QWE ASD时,输出有一次出现错误,这里是因为scanf函数在遇到空格时就会停止读取,因此在scanf函数读取玩之后,输入缓冲区中还剩下" ASD\n",而一个getchar()函数只能帮助清空一个字符,所以为了更好的解决这类问题,可以采取如下操作
char password[10]={0};
printf("请输入密码:>");
scanf("%s",password);
while(getchar() != '\n');
printf("请确认密码(Y/N):>");
int a = getchar();
if(a == 'Y')
printf("Yes");
else
printf("No");
return 0;
只需要加入一个while循环,将输入缓冲区中剩余的字符清理干净即可!