【问题标题】:C++ debug assertion error with std::cin >> char带有 std::cin >> char 的 C++ 调试断言错误
【发布时间】:2018-03-05 15:16:05
【问题描述】:

背景: 此处显示的问题/代码是我正在尝试创建的更大程序的一部分(我被告知要修剪它)。 (本节的)目的是能够接收 std::cin 输入并(当它工作时)将其输入函数: srcdsControl->WriteText(string(chr));这个函数是我自己没有创建的更大程序的一部分。

我正在尝试将输入和输出从 C++ 控制台应用程序重定向到 Python 脚本(我已经编写过,并且可以正常工作)。当我在控制台窗口中键入时,它会很好地接收输入。但是,当我将输入从 python 发送到程序的标准输入时(格式为 'command\r\n'),它会触发以下错误:

我已经尝试了以下两个程序,它们给出的错误完全相同。

我的 C++ 代码(测试 1):

#include "stdafx.h"
#include <iostream>
#include <string>

int main()
{
    try
    {
        char chr[2];
        chr[1] = 0;
        while (1)
        {
            if (std::cin >> std::noskipws >> chr[0])
            {
                if (chr[0] == '\r')
                    std::cout << "\r";
                //srcdsControl->WriteText(string(chr));
                std::cout << std::string(chr) << "\r\n";
            }
        }
    }
    catch (...)
    {
        // Ignore exception and just stop the thread.
    }
}

我的 C++ 代码(测试 2):

#include "stdafx.h"
#include <iostream>
#include <string>

int main()
{
    try
    {
        char chr[2];
        chr[1] = 0;
        while (1)
        {
            std::string s = "";
            if (std::getline(std::cin, s))
            {
                for (char& ch : s) {
                    chr[0] = ch;
                    if (chr[0] == '\r')
                        std::cout << "\r";
                    //srcdsControl->WriteText(std::string(chr));
                    std::cout << std::string(chr) << "\r\n";
                }
            }
        }
    }
    catch (...)
    {
        // Ignore exception and just stop the thread.
    }
}

注意:我不是 C++ 开发人员,我对 C++ 的了解非常有限。我需要一个具体/简单的答案。

我的问题:如何防止此错误并确保正确接收输入?如果需要,我很乐意使用完全不同的方法来接收输入,但需要对其进行具体演示。

【问题讨论】:

  • 考虑使用std::getline 来读取数据,因为您似乎正在寻找完整的行。 '\r' 只是窗口中行尾标记的一半。请参阅对话框底部的小注释“按重试调试应用程序”并利用这个机会
  • 如何防止此错误 -- 在将 C++ 代码放入更大的程序之前,您可以编写一个非常小的 main 程序,只需要查看这些行它的行为方式。无需引入 Python、线程或调用 WriteText 即可进行此测试以了解 C++ 流将如何工作。那将被视为minimal reproducible example 而不是代码 sn-ps。
  • @PaulMcKenzie 我现在编辑了帖子,只显示一个小的main 程序。
  • @user4581301 我尝试调试它,但异常来自一个单独的代码文件,我在 Visual Studio/C++ 方面的经验太少,无法理解可能提供的任何有用信息。
  • 你的程序有几个问题。 (1) 它没有尝试正确处理 EOF(不,try-catch 不会这样做)。 (2) 它确实尝试处理它很可能不应该处理的\r(运行时库为您翻译\r\n 序列)。 (3) 看起来程序试图在每个字符后插入一个换行符。如果这是它的生活目标,那么有更简单、更有效的方法来做到这一点,而无需编写任何代码。

标签: c++ console-application stdout stdin


【解决方案1】:

我设法解决了我自己的问题。

#include "stdafx.h"
#include <iostream>
#include <string>

int main()
{
    try
    {
        char chr[2];
        chr[1] = 0;
        while (1)
        {
            char c;
            if (std::cin >> std::noskipws >> c)
            {
                chr[0] = c;
                if (chr[0] == '\r')
                    std::cout << "\r";
                //srcdsControl->WriteText(string(chr));
                std::cout << std::string(chr) << std::endl;
            }
        }
    }
    catch (...)
    {
        // Ignore exception and just stop the thread.
    }
}

这段代码似乎做了我想做的事而没有给出错误。如果有人能解释为什么这行得通,而以前的代码没有,那会很有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 2022-12-14
    • 2011-12-08
    • 2013-03-26
    相关资源
    最近更新 更多