C++ string!= string

Mar*_*hal 2 c++ console dev-c++

我刚刚开始使用C++并且有一些C#的经验,所以我总体上有一些编程经验.然而,似乎马上就被击落了.我试过在Google上寻找,以免浪费任何人的时间无济于事.

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;
}
Run Code Online (Sandbox Code Playgroud)

每当我运行它,它将让我输入密码,当我点击输入它将确认然后崩溃要求我调试或发送信息给微软.当我添加while循环检查两个字符串时,这开始了.我是否正确地执行了此操作或者我错过了什么?

以防万一不清楚.我希望程序将字符串与输入进行比较,如果它们都相同,则程序将结束.

谢谢你的期待.

小智 5

你根本无法scanf()用来读书std::string.这是因为它scanf()是C API的一部分,并且它不支持非POD类型.在那里,%s格式说明符需要一个指向字符数组的指针,其大小足以保存该值(这是你无法保证的,这就是为什么scanf()甚至被认为是有害的),而你传递一个指向类型对象的指针std::string(远远不同于普通阵列).在这种情况下,一个好的编译器甚至会发出警告(如果不是错误,因为非POD类型不能通过va_list).你为什么不读入一个字符数组(C方式),或者用它std::cin来代替std::cin >> h;

  • @Marshal:是的.请参阅[The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list/).你可能会发现一些有用的东西. (3认同)
  • 有趣的是,我从视频教程中得到了这一点 - 只是证明互联网可以是最糟糕的来源,也是最好的. (2认同)