【问题标题】:C++ Carriage return and line feed in a string字符串中的 C++ 回车和换行
【发布时间】:2013-07-05 13:24:02
【问题描述】:

我正在使用 C++ 处理一些 TCP/IP 连接设备的通信。 设备要求发送的命令以\r\n结尾。

我正在使用一个配置文件,从中读取通信中使用的命令。

我遇到的问题是命令 \r\n 被解释为它们的 4 个字符,而不是回车和换行。

我尝试使用 string.data(),但得到的结果与 string.c_str() 相同。

是否有任何不错的功能可以从一开始就使其正确,还是我必须使用普通的替换功能来解决这个问题?还是我没有想到的其他方式?

我想,如果我没有找到一个非常巧妙的方法来做到这一点,我会在配置文件中省略 \r\n 并在之后添加它,但最好将它全部放在配置文件中没有任何硬编码。我想我也需要做一些硬编码,如果我想用正确的字符替换这四个字符 \r\n。

感谢您的帮助

编辑: 配置文件包含类似这样的行。

MONITOR_REQUEST = "TVT?\r\n"

【问题讨论】:

    标签: c++ string carriage-return linefeed


    【解决方案1】:

    如果配置文件中的数据需要翻译,你 必须翻译它。缺少正则表达式(它们是 这显然是矫枉过正),我不知道任何标准 可以做到这一点的功能。我们使用类似的东西:

    std::string
    globalReplace(
        std::string::const_iterator begin,
        std::string::const_iterator end,
        std::string const& before,
        std::string const& after )
    {
        std::string retval;
        std::back_insert_iterator<std::string> dest( retval );
        std::string::const_iterator current = begin;
        std::string::const_iterator next
                = std::search( current, end, before.begin(), before.end() );
        while ( next != end ) {
            std::copy( current, next, dest );
            std::copy( after.begin(), after.end(), dest );
            current = next + before.size();
            next = std::search( current, end, before.begin(), before.end() );
        }
        std::copy( current, next, dest );
        return retval;
    }
    

    为此。您可以使用"\\r\\n", "\r\n" 调用它 最后是争论,例如。

    【讨论】:

    • 这也可以作为解决方法的一个选项。前两个参数是什么?
    • @user1728363 需要转换的字符串的开始和结束迭代器。
    【解决方案2】:

    听起来您的配置文件实际上包含 4 个不同的字符 '\''r''\''n'... 您必须更改文件(例如,通过使用文件中的实际行尾进行编码字符串中的行结尾,即使这样,某些系统也不会碰巧使用 \r\n 作为其文本文件行分隔符),或者按照您的建议进行一些替换/翻译。翻译是更便携的方法。它也可以非常快......只需在字符串中维护两个指针/迭代器/索引 - 一个用于读取位置,一个用于写入,并在压缩转义符号时复制。

    【讨论】:

    • 是的,没错。正如您所指出的,有 4 个不同的字符。每行也以真正的 \r\n 结尾,但这不是命令的一部分,这也是我在读取配置文件时要中断的内容。
    • 另一个非常好的解决方案,很容易扩展以处理出现的其他转义字符(例如\a)。只是不要忘记在看到'\\' 后检查字符串的结尾。
    【解决方案3】:

    您不需要在代码中编写任何代码。 您可以很好地读取字符以附加到来自同一配置文件的传出字符串。

    假设您的 conf 文件中有名称值对:

    APPEND_EOL="\n\r" str_to_send1="这是一个测试%%APPEND_EOL%%"

    在发送前解析行时,您可以生成实际行。 如果您无法将 APPEND_EOL 存储在同一行中,那么您可以使用默认值从 ENV 中获取它,以防它未定义,或者可能在您的另一个配置文件中。

    【讨论】:

    • 听起来像是一种选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2014-05-17
    • 2017-12-11
    • 2016-03-28
    相关资源
    最近更新 更多