| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1260 人关注过本帖
标题:一天一夜未眠,还是找不出原因,救救我吧
只看楼主 加入收藏
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
你可以运行你自己改过的那个程序,然后输入一个任意的字母(不要是Z,L,W,S就可以了),然后原本他应该显示the consumer is error然后再提示你输入用户名,你输入以后他才应该让你输入密码的,但是按照你改的程序,不加fflush(stdin)的话,他就会直接跳过输入用户名的那段,出现 这个情况

2005-07-19 12:49
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
还有,这里涉及到流了,这个流就是标准输入流。

2005-07-19 12:50
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
fflush(stdin)可以用来清楚键盘缓冲区里的东西

2005-07-19 12:51
zzb_ks
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2005-7-6
收藏
得分:0 

Wellcome to elective system please enter name:A

please enter password:1234

the consumer is error please enter name: please enter password:Z

the consumer is error please enter name: please enter password:3333

Susses Enter System Press any key to continue 运行结果是这样的,他不是跳过而是多输出了一行东西而已。但是加了你的这个清除输入缓冲区的函数后,就不会出现这种 情况。在此谢谢楼上的兄弟,我这里又多学会了一些东西,谢谢你的指点。希望以后可以多多向你请教。可否加我的QQ: 67955846


2005-07-19 16:54
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
他确实是跳过了,因为电脑以为键盘缓冲区的内容是输入的内容,所以直接到了第三行,处理printf()
你第一次输入的Z,其实是赋值到了第二次显示的please enter name里面

2005-07-19 18:09
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
如果说他是照你所说的多输出了一行的话就不会出现the consumer is error
这句,而是直接再出现一次please enter name:
please enter password:3333
出现了the consumer is error就说明已经对name 和password进行了赋值的工作,并且进行了比较

2005-07-19 18:12
天空之城
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2005-6-25
收藏
得分:0 
最好不要随便清除缓冲区的内容,虽然在这些小程序里面看不到危害,可是养成了这样的习惯是编程大忌~ 要不要还要设立缓冲区来干嘛 程序,就应该让程序能按照自己的思路办事,一丝不能错! 不要老是靠请流函数这类一刀切的方法~! 定义char x; 所有的scanf语句都更正为 scanf("%d%c",&n,&x); 或者 scanf("%c%c",&c,&x); 让字符变量x来吸收多余的字符----回车符! 还有,你这是什么登录系统~~佩服中... screen.width-500)this.style.width=screen.width-500;" align="middle" border="0">

[此贴子已经被作者于2005-7-19 22:01:03编辑过]


天空之城...
2005-07-19 21:56
musicml
Rank: 1
等 级:新手上路
帖 子:273
专家分:0
注 册:2005-4-2
收藏
得分:0 
//帮你改了一下
//看看把






//输入用户名和密码,[(Z,3333),(L,4444),(W,5555),(S,6666)]
//如果用户名没有里面的就提示用户名错误,重新输入。如果密码错误,重新输入。
//如果密码输入超过三次在则自动退出
//直到用户名和密码都正确为止:
#include<stdio.h>
int main()
{
 char c; int i=0, n;
 int counter=0;
// clrscr();
 printf("Wellcome to elective system \n");
 while(i==0) /*检验用户名是否存在*/
 {
  printf("please enter name:");
  scanf("%c",&c);
  fflush(stdin);
  printf("\n");
 
  
  fflush(stdin);
  printf("\n");
  switch(c) /*如果存在,给 i 赋值*/
  {
  case 'Z' :
   i=3333;
   break;
  case 'L' :
   i=4444;
   break;
  case 'W' :
   i=5555;
   break;
  case 'S' :
   i=6666;
   break;
  default :
   printf("the consumer is error\n");
   break;
  }
 }
 printf("please enter password:");
    scanf("%d",&n);
 ++counter;
 while (n!=i&&counter!=3) /*检验密码是否正确*/
 {
  printf("password is error\n");
  printf("Enter password again:");
  scanf("%d",&n);
  fflush(stdin);
  ++counter;
 }
 if(counter==3)
  printf("Input exceed three time!\n");
 else
  printf("Susses Enter System\n");
 return 0;
}

Every thing is possible.
2005-07-19 23:42
georgezf
Rank: 1
等 级:新手上路
帖 子:275
专家分:0
注 册:2004-11-20
收藏
得分:0 
以下是引用天空之城在2005-7-19 21:56:22的发言: 最好不要随便清除缓冲区的内容,虽然在这些小程序里面看不到危害,可是养成了这样的习惯是编程大忌~ 要不要还要设立缓冲区来干嘛 程序,就应该让程序能按照自己的思路办事,一丝不能错! 不要老是靠请流函数这类一刀切的方法~! 定义char x; 所有的scanf语句都更正为 scanf("%d%c",&n,&x); 或者 scanf("%c%c",&c,&x); 让字符变量x来吸收多余的字符----回车符! 还有,你这是什么登录系统~~佩服中... screen.width-500)this.style.width=screen.width-500;" align="middle" border="0">
\r回车符的问题我已经和他讲过了,你这个办法不错!

2005-07-20 12:41
leeshd
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-7-21
收藏
得分:0 
为什么please enter name:
后面没有显示Z
是不是接受了第一次输入A后面的回车符了

2005-07-21 17:03
快速回复:一天一夜未眠,还是找不出原因,救救我吧
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016856 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved