2016-04-27 43 views
-3

這是我需要在Turbo C++中編寫的程序的一部分; 這裏,如果我給id的輸入作爲「PLAYNOW」並且作爲「PASSWORD」傳遞,變量p將存儲值0但我不存儲。 id變量在PLAYNOW結尾存儲一些垃圾數字,我無法弄清楚原因。請幫忙。請忽略任何未添加的頭文件以及我輸入密碼的方式。 謝謝!使用C++編程存儲ID和密碼

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

int main() 
{ 
    char id[7],pass[8]; 
    cout<<"Enter id: "; 
    cin.getline(id,7); 
    cout<<"Enter pass: "; 
    cin.getline(pass); 
    char idc={"PLAYNOW"}; 
    char passc={"PASSWORD"}; 
    int i=strcmp(id,idc); 
    int p=strcmp(pass,passc); 

    if(i==0&&p==o) 
     cout<<"Welcome. "; 
    else 
     exit(0); 
    getch(); 
    return 0; 
} 
+2

'char idc'請記住'char'是單個字符。也許你想'const char *'或更好的使用'std :: string'。 – drescherjm

+1

其實很難相信這段代碼編譯的時候,strcmp不應該接受一個字符作爲參數 – pm100

+1

***我需要在Turbo C++中編譯***確保你編寫了一些你花費一些時間學習現代的'C++'編譯器。 Turbo C++在25年前還不錯,但是在C++標準之前。從那以後很多事情改變了。 – drescherjm

回答

0

好,超出了許多錯誤,我根本無法開始上市,我看你是從一個字符流中讀取而不給視頻流的大小。嘗試:

cin.getline(pass, 8);

我會認真考慮使用編譯器就是有點更新,以及更注重可讀性和慣例,因爲很顯然,有更好的方法做的是最終被在這裏完成。特別是在我指出的路線中,這是非常特殊的。如果字符串長/短於8個字符會怎麼樣?

1

如果id和pass是「PLAYNOW」和「PASSWORD」,則id的長度是8,並且pass的長度是9(字符串結尾的空字符)。

我改變如下,並在cmd結果打印是歡迎。

char id [8],pass [9];

...

cin.getline(id,8);

char idc [] =「PLAYNOW」;

char passc [] =「PASSWORD」;

...

cin.getline(pass,9);

...

如果OP的代碼(我== 0 & & p == 0)

2

的一個問題是分配給變量的內存量不足。例如,對於這些行:

char id[7]; 
cin.getline(id,7); 

功能getline可以讀取和從輸入存儲在空流高達字符終止 char數組id,但隨後的程序具有比較該字符串至PLAYNOW,即 chars long。

這會導致下一個問題,當getline在流中留下未讀字符時,失敗位置位,從而阻止進一步讀取。

修復這些,甚至與老標準,OP可以做這樣的事情:

const int ssize = 32;  // enough space to store id or password 
const int ssmax = 1024; 
// big value... ^^ try std::numeric_limits<std::streamsize>::max() instead 

char id[ssize], 
    pass[ssize]; 

cout << "Enter id: "; 
cin.getline(id, ssize);   // extract (ssize - 1) chars from input 
if ( cin.fail()) { 
    cin.clear();    // if user entered more then ssize chars 
    cin.ignore(ssmax, '\n'); // clear the stream 
} 

同爲pass(OP沒有通過8到第二函數getline,太)。

然後,包含預期ID和密碼的字符串的聲明是錯誤的。使用這些:

char idc[] = "PLAYNOW"; 
char passc[] = "PASSWORD"; 

最後幾行可能太改寫:

if (strcmp(id, idc) != 0 || strcmp(pass, passc) != 0) 
    exit(0); 

cout << "Welcome. "; 
cin.get(); 

return 0;  // end of main() 

順便說一句,我很肯定std::string小號屬於C++ 98,所以這應該工作太:

#include <iostream> 
#include <string> 

int main() { 
    std::string id, pass;  
    std::cout << "Enter id: "; 
    std::getline(std::cin, id);   
    std::cout << "Enter pass: "; 
    std::getline(std::cin, pass);    

    std::string idc("PLAYNOW"); 
    std::string passc("PASSWORD"); 

    if (idc != id || passc != pass) 
     exit(0); 

    std::cout << "Welcome. "; 

    return 0; 
}