1

次の関数を書きました

 void validateUser(void)
 {
         string uName;
         string uPassword;
         char c;

         map <char*, char*> authMap;
         authMap["balaji"] = "balaji";
         authMap["rohan"] = "rohan";

         cout << "Please Enter your user name :";
         cin >> uName;
         cout << "Please Enter your password :";
        // initTermios(0);
         while((c = getchar()) != '\n')
         {
           uPassword.push_back(c);
         }
         cout << "YOU Entered :: "<<  uPassword <<std::endl;
}

上記の関数を実行すると、ユーザー名を入力した後、Enter キーを押すと、パスワード文字列を入力しなくても制御が while ループに入らないことがわかりました。上記のAntソリューション?よろしくお願いします。

4

1 に答える 1

3

ユーザー名を入力した結果として入力された改行文字は標準入力のままであり、次に読み取られるのはこれであるため、ループ終了条件はすぐに false になります。次を使用して達成できる改行文字をスキップする必要がありますignore()

cin.ignore();

C と C++ の IO 関数を混在させないことを提案します (これがどのように相互作用するかについての正確なルールはわかりませんが、避けることを好みます):

while (cin.get(c) && '\n' != c)
{
    uPassword.push_back(c);
}

または単に使用std::getline()

getline(cin, uPassword);

私のコメントで述べたように、マップは文字列の内容ではなく、文字列リテラルのアドレスによってキー付けされます。代わりに使用することを提案しmap<std::string, std::string>ます。

于 2012-06-22T10:00:56.233 に答える