2010-09-24 69 views
2

我有這個簡單的問題,從用戶使用函數獲取輸入,然後檢查輸入是否等於「密碼」。然而,strcmp永遠不會返回我想要的值,而罪魁禍首是在我的循環中的某處使用getch()分別獲取每個字符並將它們添加到字符數組中。通過讓printf顯示字符數組,我發現了這一點。如果我輸入密碼,函數會顯示爲密碼「我不知道爲什麼在我輸入的單詞後面的數組中包含了結束雙引號和空格。任何想法?下面是代碼。謝謝。一個簡單的getch()和strcmp問題

#include <stdio.h> 
#include <iostream> 
#include <conio.h> 
#include <string.h> 

int validateUser(); 

int main() 
{ 
    for(int x = 0;x<2;x++) 
    { 
     if(validateUser()) 
     { 
      system("cls"); 
      printf("\n\n\t\t** Welcome **"); break; 
     } 
     else      
     { 
      system("cls"); 
      printf("\n\n\t\tIntruder Alert!"); 
      system("cls"); 
     } 
    } 


    system("PAUSE>nul"); 
    return 0; 
} 

int validateUser() 
{ 
    char password[9]; 
    char validate[] = "pass word"; 
    int ctr = 0, c; 
    printf("Enter password : "); 
    do 
    { 
     c = getch(); 
     if(c == 32) 
     { 
      printf(" "); 
      password[ctr] = c; 
     } 

     if(c != 13 && c != 8 && c != 32) 
     { 
      printf("*"); 
      password[ctr] = c; 
     } 
     c++;  
    }while(c != 13); 

    return (!strcmp(password, validate)); 
} 
+0

我看到你已經改變了數組的大小。請您在收到答案後不要這樣做。現在我的回答沒有意義。 – codaddict 2010-09-24 04:57:29

+0

你也改變了'C++'爲'ctr ++',這使得用戶@joshD的答案完全無用。請恢復更改。 – codaddict 2010-09-24 05:03:18

+0

對不起,先生,這些只是錯別字,但我現在將恢復它。 – arscariosus 2010-09-24 05:08:38

回答

6
  • 您的字符數組password不包含 具有終止空字符
  • 你需要確保你不 東西超過8焦炭引入 password
  • c++應該ctr++

do { 
// stuff char into password. 
ctr++; 
}while(c != 13 && ctr <8); 

password[ctr] = 0; 
+0

哦,所以我必須在用戶按下輸入先生之後明確添加/ 0嗎? – arscariosus 2010-09-24 04:47:14

+1

是的。你是對的。 – codaddict 2010-09-24 04:53:14

+0

其實它的'\ 0'的值是'0',所以你可以分配'0' – codaddict 2010-09-24 05:00:11

0

getch()是一個非標準的頭文件中定義<conio.h>的功能,依靠非標準的特性,不建議當你想你的代碼移植。:)

+0

我知道這位先生,但這些信息會以怎樣的方式幫助我? – arscariosus 2010-09-24 04:46:20

+1

它可能會提示你尋找替代品,或者使用''的C風格,或者使用std :: cin的成員函數的C++風格。同樣,'\ n''是換行符的可移植表示法,這是硬編碼ASCII 13(回車代碼,很少用於DOS/Windows外部)的一種很好的替代方法。當你剛開始學習編碼時不是優先考慮的事情。 – 2010-09-24 05:29:04

2

你正在遞增循環中的c。你應該增加ctr。此外,所有其他人都說過的東西(空終止符,只有8個字符等)。