2013-10-16 233 views
2

我剛剛開始使用C++,並具有一些C#的使用經驗,所以我總體上具有一些編程經驗。但是,似乎馬上就被我擊落了。我試圖在谷歌上看,以免浪費任何人的時間無濟於事。C++字符串!=字符串

int main(int argc, char *argv[]) 
{ 
    HANDLE hConsole; 
    int k = 5; 
    string h; 
    string password = "pass"; 

    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleTextAttribute(hConsole, k); 
    SetConsoleTextAttribute(GetStdHandle(STD_INPUT_HANDLE), 0x5B); 

    while (h != password) 
    { 
     printf("This PC is locked\nEnter the password to gain access\n"); 
     scanf("%s", &h); 
    } 

    printf("\n"); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

每當我跑這將讓我輸入密碼,當我點擊進入會承認,然後死機要求我調試或將信息發送給微軟。這在我添加while循環檢查兩個字符串時開始。我是否正確執行了這個或者我錯過了什麼?

以防萬一不清楚。我想讓程序比較一個字符串和一個輸入,如果它們都相同,程序將結束。

感謝您的期待。

+6

不要使用'scanf'對於C字符串,尤其不適合'的std :: string'。使用'std :: cin'(如果需要,結合'std :: getline')。 – chris

+0

感謝您的反饋。 – Marshal

回答

5

您根本無法使用scanf()來讀入std::string。這是因爲scanf()是C API的一部分,它不支持非POD類型。在那裏,%s格式說明符需要一個指向字符數組的指針,其大小足以容納該值(您無法真正保證這一點,這就是爲什麼scanf()甚至被認爲是有害的),而您將指針傳遞給類型爲std::string的對象(這遠遠不同於普通數組)。一個好的編譯器甚至會在這種情況下發出警告(如果不是錯誤,因爲非POD類型不能通過va_list傳遞)。爲什麼不讀入字符數組(C方式),或者使用std::cin而不是std::cin >> h;

+2

有趣的是,我從視頻教程中獲得了這一點 - 只是證明互聯網可能是最糟糕的來源以及最好的。 – Marshal

+3

@Marshal:對。看看[The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list/)。你可能會發現一些有用的東西。 – 2013-10-16 18:55:41

+1

@Marshal,只是好奇,哪個教程? – chris

0

1 /許多C++初學者,實際上是在編寫C代碼。 查找有關C++中輸入/輸出的文檔。

2 /你如何編譯你的代碼?您誤差應已陷入由編譯器

+0

當前使用DevC++ - 免費的C++ IDE並按F9編譯並運行該程序。 – Marshal

+1

@vincentB編譯器無法檢測到錯誤類型的地址傳遞給'scanf()'!該程序將按OP所述進行編譯,運行和崩潰。 –

+0

謝謝你的擡頭。 – Marshal

2

克里斯建議,這個程序可以通過使用正確的功能被簡化:

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string password = "pass", input; 

    do 
    { 
     std::cout << "This computer is locked." 
        << "Enter the password to gain access: "; 
     std::cin >> input; 
    } while (input != password); 

    std::cout << "Welcome!" << std::endl; 
    system("PAUSE"); 

    return 0; 
}