键盘缓冲区残余信息问题
#include
int main()
{
int a;
char c;
do
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d c=%c\n",a,c);
/*printf("c=%d\n",c);*/
}while(c!='N');
}
scanf("%c",&c);这句不能正常接收字符,什么原因呢?我们用printf("c=%d\n",c);将C用int表示出来,启用
printf("c=%d\n",c);这一句,看看scanf()函数赋给C到底是什么,结果是 c=10
,ASCII值为10是什么?换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里
\r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.
解决办法:可以在两个scanf()函数之后加个fflush(stdin);,还有加getch(); getchar();也可以,但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。但是加fflush(stdin);不管什么情况都可行。
函数名: fflush
功 能: 清除一个流
用 法: int fflush(FILE *stream);
#include
int main()
{
int a;
char c;
do
{
scanf("%d",&a);
fflush(stdin);
scanf("%c",&c);
fflush(stdin);
printf("a=%d c=%c\n",a,c);
}while(c!='N');
}
这里再给一个用“空格符”来处理缓冲区残余信息的示例:
运行出错的程序:
#include
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*这里%前没有空格*/
}
}
使用了空格控制符后:
#include
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意这里%前有个空格*/
}
}
可以运行看看两个程序有什么不同。(空格符号清除了残余信息的作用,scanf能够正确的工作了)
一个好的函数指针应用的程序
//compiler: win-tc v1.91
//created by cgha
#include <stdio.h>
typedef void(*pfun)(void);// pointer to the function
struct cmdEntry
{
char * cmdname;
pfun pfun1;
char * cmdcomment;
}*pStruct;
void quit()
{
printf("%s","i am quit function\r\n");
}
void reboot()
{
printf("%s","i am reboot function\r\n");
}
struct cmdEntry cmdList[] =
{
/* cmdchar cmdhandler help */
{ "Q", quit,"quit funcion" },
{ "R", reboot,"reboot function" },
};
void main()
{
char cmd;
pStruct= &cmdList[0];
printf("cmd1: %s ", pStruct->cmdname);
printf("%s", pStruct->cmdcomment);
printf("%s" ,"\r\n");
pStruct++;
printf("cmd2: %s ", pStruct->cmdname);
printf("%s", pStruct->cmdcomment);
printf("%s" ,"\r\n");
printf("Please input the number of function you want to exe(Q/R)\r\n");
scanf("%c",&cmd);
switch(cmd)
{
case 'q':
case 'Q':
pStruct--;
(pStruct->pfun1)();
getchar();//作用可能是用来屏蔽缓存中回车键带来的问题
break;
case 'r':
case 'R':
(pStruct->pfun1)();
getchar();
break;
default:printf("error cmd");
getchar();
}
}
文章评论(0条评论)
登录后参与讨论