【问题标题】:C++ string != stringC++字符串!=字符串
【发布时间】:2013-10-25 00:53:25
【问题描述】:

我刚刚开始使用 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 循环检查两个字符串时,这开始了。我是否正确执行了此操作或遗漏了什么?

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

感谢收看。

【问题讨论】:

  • 不要将scanf 用于C 字符串,尤其是std::string。使用std::cin(如果需要,可以结合std::getline)。
  • 感谢您的反馈。

标签: c++ console dev-c++


【解决方案1】:

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

【讨论】:

  • 有趣的是我是从视频教程中得到的——这只是证明互联网既可以是最差的来源,也可以是最好的来源。
  • @Marshal:是的。看看The Definitive C++ Book Guide and List。您可能会在那里找到一些有用的东西。
  • @Marshal,很好奇,哪个教程?
【解决方案2】:

正如 chris 所建议的,这个程序可以通过使用正确的函数来简化:

#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;
}

【讨论】:

    【解决方案3】:

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

    2/ 你如何编译你的代码?你的错误应该已经被编译器捕捉到了

    【讨论】:

    • 当前使用 DevC++ - 免费的 C++ IDE,按 F9 编译并运行程序。
    • @vincentB 编译器无法检测到错误类型的地址被传递给scanf()!该程序将按照 OP 描述的方式编译、运行和崩溃。
    • 感谢您的提醒。
    • 至少 VS2010 编译器在警告我:warning C4996: 'scanf': This function or variable may be unsafe.
    猜你喜欢
    • 2020-08-23
    • 2012-10-09
    • 1970-01-01
    • 2011-05-20
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多