字符串中的 C++ 回车和换行
Posted
技术标签:
【中文标题】字符串中的 C++ 回车和换行【英文标题】:C++ Carriage return and line feed in a string 【发布时间】: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"
【问题讨论】:
【参考方案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 中获取它,以防它未定义,或者可能在您的另一个配置文件中。
【讨论】:
听起来像是一种选择。以上是关于字符串中的 C++ 回车和换行的主要内容,如果未能解决你的问题,请参考以下文章