用C ++引用字符串

时间:2013-07-17 12:20:21

标签: c++ string double-quotes

在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开发。所使用的技术必须兼容两个平台。如果没有功能,这意味着我必须写一个。

7 个答案:

答案 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;

More info on user-defined literals

答案 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