2

我刚刚开始使用 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;
}

每当我运行它时,它都会让我输入密码,当我单击 Enter 时,它会确认然后崩溃,要求我调试或向 Microsoft 发送信息。当我添加 while 循环检查两个字符串时,这开始了。我是否正确执行了此操作或错过了什么?

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

感谢您的关注。

4

3 回答 3

5

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

于 2013-10-16T18:51:53.230 回答
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;
}
于 2013-10-16T18:56:41.463 回答
0

1/ 与许多 C++ 初学者一样,您实际上是在编写 C 代码。查找有关 C++ 中输入/输出的文档。

2/ 你如何编译你的代码?您的错误应该已被编译器捕获

于 2013-10-16T18:56:32.703 回答