我没办法了,只好求助了!!!

永澄 2012-04-14 08:35:53
#include"windows.h"

char *login()
{
int i = 0, second;
char password, pw[19];
label:printf("请输入密码:");
while( 1 )
{
password = getch();
if( password < '!' || password > '~' )
{
if( password == '\b' || password == '\r' )
{
if( password == '\r' ) break;
else printf("\b \b"), i --;

}
else
{
second = 3;
while( second )
{
system("cls");
printf("错误输入,请重新输入\t");
printf("%d", second -- );
Sleep(1200);
}
system("cls");
goto label;

}
}
else
{
pw[i] = password;
i ++;
printf("*");
}
}
pw[i] = '\0';
return pw;
}

void main()
{
char *password = "infinite";
if( strcmp( password, login() ) == 0 ) printf("密码正确\n\n");
else printf("密码不正确\n\n");
}

郁闷的地方就在 红色字 部分,只要有 second = x; ( x 是一个整数 ),那个 while 循环 每次都会循环 2次

你们可以复制去运行一下看看
...全文
98 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰菓 2012-04-14
  • 打赏
  • 举报
回复
没人回答么
永澄 2012-04-14
  • 打赏
  • 举报
回复
把源代码给改了,不行...o(︶︿︶)o

second = 3;
while( second )
{
system("cls");
printf("错误输入,请重新输入\t");
printf("%d", second -- );
Sleep(1200);
}
system("cls");
goto label;


我想问,为什么 循环结束一次后即 second = 0 后,程序会令 second = 3,然后再来一次循环知道 second = 0;

那个 second = 3; 无论是放在 循环前面,还是循环后面都是这样的结果
evencoming 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

password = getch();
==>
rewind(stdin);
password = getch();


按你方法改了,还是老样子
[/Quote]

#include"windows.h"

char *login()
{
int i = 0, second=3;
char password, pw[19];
label:printf("请输入密码:");
while( 1 )
{
rewind(stdin);
password = getch();
if( password < '!' || password > '~' )
{
if( password == '\b' || password == '\r' )
{
if( password == '\r' ) break;
else printf("\b \b"), i --;

}
else
{

if( second )
{
system("cls");
printf("错误输入,请重新输入\t");
printf("%d", second -- );
Sleep(1200);
}
system("cls");
goto label;
}
}
else
{
pw[i] = password;
i ++;
printf("*");
}
}
pw[i] = '\0';
return pw;
}

void main()
{
char *password = "infinite";
if( strcmp( password, login() ) == 0 ) printf("密码正确\n\n");
else printf("密码不正确\n\n");

}

永澄 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

password = getch();
==>
rewind(stdin);
password = getch();
[/Quote]

按你方法改了,还是老样子
evencoming 2012-04-14
  • 打赏
  • 举报
回复
password = getch();
==>
rewind(stdin);
password = getch();
evencoming 2012-04-14
  • 打赏
  • 举报
回复
用getch,getchar,scanf读取字符串或者字符的时候容易出现缓冲区残留'\n'的情况。

于是下次读取的时候,就会读取到'\n'.
为了防止这种情况,可以在scanf函数之前加下面三条语句之一:
标准:rewind(stdin);
windows扩展:fflush(stdin);
暴力:stdin->_cnt=0;

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧