在Pascal Lazarus / Delphi中,我们有一个函数QuotedStr(),它将任何字符串包装在单引号中。
以下是我当前C ++代码的示例:
//I need to quote tblCustomers
pqxx::result r = txn.exec( "Select * from \"tblCustomers\" ");
另一个:
//I need to quote cCustomerName
std::cout << "Name: " << r[a]["\"cCustomerName\""];
与上面类似,我必须经常双引号。输入这个有点让我失望。我可以使用标准功能吗?
BTW,我使用带有Code :: Blocks的Ubuntu / Windows开发。所使用的技术必须兼容两个平台。如果没有功能,这意味着我必须写一个。
答案 0 :(得分:6)
使用C ++ 11,您可以创建这样的用户定义文字:
#include <iostream>
#include <string>
#include <cstddef>
// Define user defined literal "_quoted" operator.
std::string operator"" _quoted(const char* text, std::size_t len) {
return "\"" + std::string(text, len) + "\"";
}
int main() {
std::cout << "tblCustomers"_quoted << std::endl;
std::cout << "cCustomerName"_quoted << std::endl;
}
输出:
"tblCustomers"
"cCustomerName"
如果需要,您甚至可以使用较短的名称来定义运算符,例如:
std::string operator"" _q(const char* text, std::size_t len) { /* ... */ }
// ...
std::cout << "tblCustomers"_q << std::endl;
答案 1 :(得分:4)
C ++ 14添加了std::quoted
,它确实做到了这一点,实际上更多:它负责在输出流中转义引号和反斜杠,以及在输入流中转义它们。它是高效的,因为它不会创建一个新的字符串,它实际上是一个IO操纵器。 (所以你不会像你一样得到一个字符串。)
#include <iostream>
#include <iomanip>
#include <sstream>
int main()
{
std::string in = "\\Hello \"Wörld\"\\\n";
std::stringstream ss;
ss << std::quoted(in);
std::string out;
ss >> std::quoted(out);
std::cout << '{' << in << "}\n"
<< '{' << ss.str() << "}\n"
<< '{' << out << "}\n";
}
给出
{\Hello "Wörld"\
}
{"\\Hello \"Wörld\"\\
"}
{\Hello "Wörld"\
}
如its proposal所述,它实际上是为字符串的往返而设计的。
答案 2 :(得分:0)
String str = "tblCustomers";
str = "'" + str + "'";
查看更多选项here
答案 3 :(得分:0)
没有标准功能,除非你算std::basic_string::operator+()
,但写它是微不足道的。
我对你的速度减慢感到有些困惑 - quoted( "cCustomerName" )
是更多的角色,不是吗?产品:&gt;
答案 4 :(得分:0)
您可以使用自己的占位符字符代表引号,一些永远不会使用的ASCII符号,并在“输出字符串之前”替换它。
答案 5 :(得分:0)
#include <iostream>
#include <string>
struct quoted
{
const char * _text;
quoted( const char * text ) : _text(text) {}
operator std::string () const
{
std::string quotedStr = "\"";
quotedStr += _text;
quotedStr += "\"";
return quotedStr;
}
};
std::ostream & operator<< ( std::ostream & ostr, const quoted & q )
{
ostr << "\"" << q._text << "\"";
return ostr;
}
int main ( int argc, char * argv[] )
{
std::string strq = quoted( "tblCustomers" );
std::cout << strq << std::endl;
std::cout << quoted( "cCustomerName" ) << std::endl;
return 0;
}
有了这个你得到了你想要的东西。
答案 6 :(得分:0)
使用某些C函数和反斜杠转义引号怎么办? 就像sprintf_s:
CEOpt.CovArray.Test()
结果字符串为:
#define BUF_SIZE 100
void execute_prog() {
//Strings that will be predicted by quotes
string param1 = "C:\\users\\foo\\input file.txt", string param2 = "output.txt";
//Char array with any buffer size
char command[BUF_SIZE];
//Concating my prog call in the C string.
//sprintf_s requires a buffer size for security reasons
sprintf_s(command, BUF_SIZE, "program.exe \"%s\" \"%s\"", param1.c_str(),
param2.c_str());
system(command);
}
这里是documentation。