2015-06-28 105 views
0

下面是我在C++中設計的應用程序的一部分。下面的代碼片段顯示***爲用戶輸入的密碼。在程序中的兩個地方使用代碼,一個工作正常,另一個地方在enterdPassword的末尾顯示未知字符。將未知字符添加到最後一個字符串

這裏工作正常。輸入的密碼保存在文件中以備後用。

if(FirstRun()){ 
    display_welcome_text_first_run(); 

    cout<<"\nEnter A Password(Max 13 character): "; 
    for(i=0; i<13; i++){ 
     x = getch(); 
     if(x == '\r'){ break; } 
     putchar('*'); 
     p[i]=x; 
    } 

    p[i+1]='\0'; 
    string pwd(p); 
    ofstream o(PASSWORD_FILE,ios::binary); 
    o <<pwd<<endl; 
    o.close(); 

這顯示錯誤它示出了在enterdPassword末端的未知字符。

bool verifyPassword(){ 
    string savdPassword; 
    char px[20], x; 
    int i; 
    cout<<"Enter Your Password To Continue: "; 

    for(i=0; i<13; i++){ 
     x = getch(); 
     if(x == '\r'){ break; } 
     putchar('*'); 
     px[i] = x; 
    } 
    px[i+1] = '\0'; 

    string enterdPassword(px); 

    ifstream pp(PASSWORD_FILE, ios::binary); 
    pp>>savdPassword; 
    pp.close(); 
    cout<<endl<<enterdPassword;<<" "<<savdPassword; //for debugging 
    if(enterdPassword == savdPassword){ 
     return true; 
    } 
    else{return false;} 
} 

程序運行的圖像。 Image of program run.

我不明白爲什麼相同的代碼(只有不同​​的變量)給予不同的工作如何糾正代碼以正確工作?

+0

我認爲,在這兩種情況下,'px [i + 1] ='\ 0';'應該是'px [i] ='\ 0';'。 –

+0

好吧,讓我檢查 – Pushkar

回答

5

你必須改變

p[i+1]='\0'; 

p[i]='\0'; 

因爲i在上次循環迭代後已被遞增。

然而,最好不要在所有使用的原始字符數組:

string pwd; 
for(i=0; i<13; i++){ 
    x = getch(); 
    if(x == '\r'){ break; } 
    pwd += x; 
} 
+0

這確實解決了我的問題,但我仍然不明白爲什麼第一次執行沒有出錯 – Pushkar

+0

@Pushkar在第一個函數中,你可以用零初始化(偶然或者它是一個全局/靜態變量) –

+0

nope它只是在初始化的情況下,在案例1中。 – Pushkar

4

考慮x =='\ r'的情況。這裏沒有存儲i px [i]的值。您將'\ 0'字符存儲在第i + 1個位置。

您應該將此更改爲px [i](對於輸入\ r的i)會給出正確的字符。

px[i]=='\0' 
2

爲了簡單起見假設你輸入一個字母的密碼(不不管它是什麼)。

您輸入循環,變量i等於0。然後循環迭代,並且i增加到1,並且您閱讀換行符(或更確切地說'\r')並且您跳出循環,i等於1。然後,您終止字符串i + 1,因此您將終止符設置爲px[2],超出輸入字符串的長度。

相關問題