如何在C 中输出两个字符串版本,一个具有逃生字符,另一个则不是
How to output two versions of a string, one with escape character and the other not, in C++?
我有机会定义字符串,以便说
string s = "abc"def\hhh"i";
此定义后,我想输出此字符串的两个版本。第一个是默认情况下的s
输出:
abc" def hhh" i
我想要的第二个是:
abc " def \ hhh " i
我正在编写一种"递归"定义,用额外的逃生字符定义另一个字符串不是解决方案。我还查找了原始字符串,但它只能输出第二个不是第一个,它是C 11的功能,对于某些计算机而言,这太新了。
如何在不使用C 11的情况下输出字符串的第二版?如果我必须使用C 11,如何避免两次定义字符串?
编写这样的功能非常简单:
std::string to_quoted(std::string const& src) {
std::string result;
result.reserve(src.size()); // Not necessary but makes the code more efficient (mentioned in comments)
for (std::size_t i = 0; i < src.length(); i++) {
switch (src[i]) {
case '"': result += "\""; break;
case '': result += "\\"; break;
// ...
default: result += src[i];
}
}
return result;
}
可能有更好的解决方案,我认为这是最简单,最快的解决方案。我不明白您的意思是"定义另一个字符串",也许您是说构造另一个字符串是不允许的,在这种情况下,只是输出到流而不是串联字符。
我倾向于将类似的东西写为具有范围输入和迭代器输出的模板。这提供了很大的灵活性,因为您可以使用相同的功能输出到流,另一个字符串或其他任何可以包装到输出迭代器中的内容。
输入甚至不必是std::string
,它可能是std::vector
,简单的数组或提供begin()
和end()
过载的任何类型(范围循环的要求)。
与简单地从该函数返回std::string
的另一个优势是,您不必为结果创建一个临时字符串,以避免记忆分配以提高性能。
#include <iostream>
#include <string>
#include <iterator>
template< typename Range, typename OutputIterator >
OutputIterator copy_escaped( const Range& in, OutputIterator out ){
for( const auto& c : in ){
switch( c ){
case '"':
*out++ = '';
*out++ = '"';
break;
case '':
*out++ = '';
*out++ = '';
break;
case 'n':
*out++ = '';
*out++ = 'n';
break;
case 'r':
*out++ = '';
*out++ = 'r';
break;
case 't':
*out++ = '';
*out++ = 't';
break;
// Could add more stuff to escape here
// case ...:
default:
*out++ = c;
}
}
return out;
}
您可以轻松地扩展功能以逃脱其他字符。
用法示例:
int main()
{
std::string s = "abc"def\hhh"i";
// output normal
std::cout << s << std::endl;
// output escaped
copy_escaped( s, std::ostream_iterator<char>( std::cout ) );
std::cout << std::endl;
// output escaped to other string
std::string escaped_s;
escaped_s.reserve( s.size() ); // not required but improves performance
copy_escaped( s, back_inserter( escaped_s ) );
std::cout << escaped_s << std::endl;
}
实时演示。
相关文章:
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用动态分配将 char* 复制到另一个字符**
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 如何检查一个字符是否与字符数组中的另一个字符匹配?
- C++:使用另一个字符将一个字符大写
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- 使用连续分隔符和空最后一个字符进行拆分
- 如何比较文件中包含的下一个字符
- 如何检查字符串中的最后一个字符是否是某个字符并将其从字符串中删除?(C++)
- 如何从文本文件中一次读取一个字符
- 将一个字符替换为字符串中更多数量的字符,而不删除C++中的其他字母
- 读取输入后,输出丢失了一个字符
- 比较最后一个字符,不区分大小写(带谓词?
- 如果一个字符,比如说"9",我减去"0",我在结果上使用 is 数字,我是真还是假
- 为什么 std::istream::gcount 返回的字符比预期的多一个字符
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- 使用 char 将一个字符数组分配给另一个字符数组时出现奇怪的行为
- 在弦乐器中删除最后一个字符