C++ 字符串中的回车符和换行符

C++ Carriage return and line feed in a string

本文关键字:换行符 回车 字符串 C++      更新时间:2023-10-16

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

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

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

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

有什么好的功能可以从一开始就正确使用它,还是我必须使用普通的替换函数来解决这个问题?还是其他我没有想到的方式?

我想,如果我没有找到一种非常简洁的方法,我将省略配置文件中的\r,然后添加它,但是最好将其全部放在配置文件中而无需任何硬编码。我想如果我尝试将四个字符\r替换为正确的字符,我也需要进行一些硬编码。

感谢您的任何帮助

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

MONITOR_REQUEST = "TVT?\r">

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

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", "rn" 为例如,最后是参数。

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

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

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

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

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