在C++中如何在字符串中添加回车和换行符

4

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

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

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

我试过使用 string.data(),但结果和 string.c_str() 相同。

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

我想,如果找不到一个真正好的方法来解决这个问题,我将只需在配置文件中省略 \r\n 并在之后添加它,但最好能够在配置文件中全部解决,而不需要任何硬编码。如果我尝试用正确的字符替换四个字符 \r\n,我想我也需要进行一些硬编码。

感谢任何帮助。

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

MONITOR_REQUEST = "TVT?\r\n"

3个回答

5
如果配置文件中的数据需要翻译,您必须进行翻译。除了正则表达式(这显然是过度设计),我不知道是否有任何标准函数可以做到这一点。我们使用类似以下的方法:
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
需要转换的字符串的开始和结束迭代器。 - James Kanze

3
看起来你的配置文件实际上包含了4个不同的字符'\''r''\''n'...你必须改变文件(例如,通过在文件中使用实际的行结束符来编码字符串中的行结束符,在某些系统中也不会使用\r\n作为它们的文本文件行分隔符),或者像你建议的那样进行一些替换/翻译。翻译是更具可移植性的方法。它也可以非常快速...只需维护两个指针/迭代器/索引到字符串 - 一个用于读取位置,一个用于写入,并在压缩转义符时复制过去。

是的,没错。正如你所指出的那样,有4个不同的字符。每一行也以真实的\r\n结尾,但这不是命令的一部分,这也是我在读取配置文件时断开连接的地方。 - user1728363
另一个非常好的解决方案,可以轻松扩展以处理其他转义字符(例如\a),如果它们出现。只是在看到 '\\' 后不要忘记检查字符串的结尾。 - James Kanze

2
你不需要手动编写代码,你可以从相同的配置文件中读取字符来追加到要发送的字符串中。
假设您的配置文件中有名称值对:
APPEND_EOL="\n\r" str_to_send1="this is a test%%APPEND_EOL%%"
在发送之前解析行时,您可以生成实际的行。如果不能将APPEND_EOL存储在相同的行中,则可以从环境变量中选择它,并设置默认值(如果未定义),或者在另一个配置文件中选取 APPEND_EOL 。

听起来像是一个可选项。 - user1728363

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接