2015-09-10 4 views
0

Я пишу программу для сброса пароля, и у меня возникают некоторые проблемы с экранированием программы до того, как будет выполнено условие final (accept new password). Я использую функцию getch() conio.h для принятия ввода для записи в строку (используя string.h)getch() Приравнивание возврата каретки к клавише esc

Я использую Borland TurboC++ V4.0 для обеспечения совместимости, поскольку это дополнительный код для старая программа MS DOS. Если бы я мог, я бы использовал более современный идеал/компилятор.

Это небольшой фрагмент программы; Я оставил заголовки и новые строки пароля/проверки пароля, поскольку они работают atm. Я очень новичок в программировании на С, я знаю, что это, вероятно, не самый простой способ писать, и есть много избыточности. Я попытался создать флаг для выхода из программы, а также функцию break, и они оба столкнулись с одной и той же проблемой; они рассматривают '\ r' как esc и наоборот.

main() 
{ 
char password[] = "0000000000000000000"; 
char newpassword[] = "0000000000000000000"; 
char checkpassword[] = "0000000000000000000"; 
char answer[] = "hrigsetup"; 
initgraph(&gd,&gm,"C://TC//BGI"); 

//draw screen 
rectangle(0,0,screen_x,screen_y); 
rectangle(screen_x/4,screen_y/3,(3*(screen_x/4)),(2*(screen_y/3))); 
rectangle(((screen_x/4)+50),((screen_y/3)+45),(3*(screen_x/4)-50),((screen_y/3)+20)); 
rectangle(((screen_x/4)+50),((screen_y/3)+90),(3*(screen_x/4)-50),((screen_y/3)+65)); 
rectangle(((screen_x/4)+50),((screen_y/3)+135),(3*(screen_x/4)-50),((screen_y/3)+110)); 

//write text 
setcolor(headercolor); 
settextstyle(DEFAULT_FONT,HORIZ_DIR,2); 
settextjustify(CENTER_TEXT,TOP_TEXT); 
outtextxy(screen_x/2,((screen_y/4)),"Change Password"); 
setcolor(drawcolor); 
settextstyle(DEFAULT_FONT,HORIZ_DIR,1); 
settextjustify(LEFT_TEXT,TOP_TEXT); 
outtextxy((screen_x/2)-108,((screen_y/2)-70),"Enter Old Password"); 
outtextxy((screen_x/2)-108,((screen_y/2)-25),"Enter New Password"); 
outtextxy((screen_x/2)-108,((screen_y/2)+20),"Re-Enter New Password"); 


//enter old password 
//password entry 
while(unlock != 1 && esc_key != 1) 
{ 
    while((password[p] = getch()) != '\r')           //mask text logic 
    { 
     if(password[p] == '\b')             //tolerate a backspace 
     { 
      if(p == 17 && endchar == 0)          //Logic password field 
      {                //bounds/overflow protection 
       password[p] = ' '; 
       setcolor(clear); 
       settextstyle(DEFAULT_FONT,HORIZ_DIR,1); 
       settextjustify(LEFT_TEXT,TOP_TEXT); 
       outtextxy((screen_x/2)-(100-(p*8)),(screen_y/2)-50,"Û"); 
       endchar = 1; 
      } 
      else 
      { 
       password[p] = ' '; 
       setcolor(clear); 
       settextstyle(DEFAULT_FONT,HORIZ_DIR,1); 
       settextjustify(LEFT_TEXT,TOP_TEXT); 
       outtextxy((screen_x/2)-(100-((p-1)*8)),(screen_y/2)-50,"Û"); 
       p--; 
       if(p <= -1) 
        p = 0; 
      } 
     } 
      else if(password[p] == 27)   //esc logic 
      {         //have tried 27, 0x1b, '\027 
       break; 
     } 
     else 
     { 
      if(clear_bar == 1)           //erase contents of password 
      {                //box 
       setcolor(clear); 
       settextstyle(DEFAULT_FONT,HORIZ_DIR,3); 
       outtextxy((screen_x/2)-2,(screen_y/2)-59,"ÛÛÛÛÛÛÛÛÛ"); 
       setcolor(drawcolor); 
       settextstyle(DEFAULT_FONT,HORIZ_DIR,1); 
       settextjustify(LEFT_TEXT,TOP_TEXT); 
       clear_bar = 0; 
      } 
      setcolor(drawcolor); 
      settextstyle(DEFAULT_FONT,HORIZ_DIR,1); 
      settextjustify(LEFT_TEXT,TOP_TEXT); 
      outtextxy((screen_x/2)-(100-(p*8)),(screen_y/2)-50,"*"); 
      if(p == 17) 
      { 
       p = 17; 
       endchar = 0; 
      } 
      else 
       p++; 

     } 
    } 
    if(strcmp(password, answer) !=0 && esc_key != 1)         //check password = wrong, 
    {                 //clear password box, fill 
     setcolor(headercolor);          //read and write "incorrect" 
     settextjustify(CENTER_TEXT,TOP_TEXT);      //in the box, write "Try Again" 
     settextstyle(DEFAULT_FONT,HORIZ_DIR,3);      //below input box 
     outtextxy((screen_x/2)-2,(screen_y/2)-59,"ÛÛÛÛÛÛÛÛÛ"); 
     setcolor(drawcolor); 
     settextstyle(DEFAULT_FONT,HORIZ_DIR,1); 
     outtextxy(screen_x/2,(screen_y/2)-50,"Incorrect"); 
     outtextxy(screen_x/2,(screen_y/2)+100,"Try Again"); 
     unlock = 0; 
     clear_bar = 1; 
     newp_ent = 0; 
     password[p] = 0; 
     p = 0; 


    } 
    if(strcmp(password, answer) == 0 && esc_key != 1)        //check password = correct 
    {                // clear and fill input box 
     setcolor(unlock_color);         //green and display "Correct" 
     settextjustify(CENTER_TEXT,TOP_TEXT);     //write "Press Any Key" below 
     settextstyle(DEFAULT_FONT,HORIZ_DIR,3);     //the input box 
     outtextxy((screen_x/2)-2,(screen_y/2)-59,"ÛÛÛÛÛÛÛÛÛ"); 
     setcolor(clear); 
     settextstyle(DEFAULT_FONT,HORIZ_DIR,1); 
     outtextxy(screen_x/2,(screen_y/2)+100,"ÛÛÛÛÛÛÛÛÛ"); 
     setcolor(drawcolor); 
     settextstyle(DEFAULT_FONT,HORIZ_DIR,1); 
     outtextxy(screen_x/2,(screen_y/2)-50,"Correct"); 
     unlock = 1; 
     newp_ent = 0; 
    } 
} 
+0

эта линия, в строке 87 публикуемую кода: 'р = 17;' абсолютно ничего не делает, как предшествующее 'if' уже доказано, что«р»уже равна 17 – user3629249

+0

есть много" магических чисел в коде. Строго предложите (и вы оцените это при выполнении технического обслуживания), что все такие числа будут # define'd с содержательными именами, а затем используйте эти значащие имена в коде – user3629249

+0

. Для удобства чтения и ясности кода последовательно отступайте код , Предложите 4 пробела после каждой открытой скобки '{' и un-indent перед каждой закрывающей скобкой '}' Никогда не используйте вкладки для отступов, так как каждый текстовый редактор/редактор имеет ширину табуляции/ширину закладки, установленную по-разному. Предложите 4 пробела, как это видно, даже с шириной шрифта шириной – user3629249

ответ

2

Существует строка, пропускающая код блока, который обнаруживает клавишу Esc. Вы обнаружили это, но не установили флаг, который у вас есть для этой цели.

else if(password[p] == 27) 
{ 
    esc_key = 1;   // <-- add this line 
    break; 
} 
+0

Извините, переменная esc_key - это флаг, который я пытался использовать, когда функция break не работала для меня. Я использовал его, чтобы все петли while были ложными, если они были активны, поэтому он пропустит до конца программы. У него была та же проблема, что и при использовании break, это закончило бы программу при входе в систему. Я забыл вытащить флаг из функций while до того, как я разместил их. – tsmetana

+0

Я запустил (версию) вашего кода и добавил, что эта строка заставляла его вести себя. –

+0

Вы правы, я просто попробовал. Неиспользуемая функция разрыва, без нее, она заставляла его вести себя непредсказуемо. Спасибо! – tsmetana