1

在 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\""];

与上面类似,我必须经常使用双引号字符串。输入这个有点让我慢下来。我可以为此使用标准功能吗?

顺便说一句,我使用带有 Code::Blocks 的 Ubuntu/Windows 进行开发。使用的技术必须在两个平台上兼容。如果没有函数,这意味着我必须写一个。

4

7 回答 7

9

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"\
}

正如其提案中所述,它实际上是为字符串的往返而设计的。

于 2017-04-24T20:16:17.133 回答
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;

有关用户定义文字的更多信息

于 2013-07-17T12:52:53.793 回答
1
String str = "tblCustomers";
str = "'" + str + "'";

在此处查看更多选项

于 2013-07-17T12:26:05.020 回答
0

没有标准函数,除非你 count std::basic_string::operator+(),但写它是微不足道的。

我对是什么让你慢下来感到有些困惑——quoted( "cCustomerName" )更多的角色,不是吗?:>

于 2013-07-17T12:29:31.973 回答
0

您可以使用自己的占位符字符来代表引号,一些永远不会使用的 ASCII 符号,并在输出字符串之前将其替换为 "。

于 2013-07-17T12:37:42.493 回答
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;
}

有了这个,你得到你想要的。

于 2014-07-02T10:22:31.770 回答
0

使用一些 C 函数和反斜杠来转义引号怎么样?像 sprintf_s:

#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);

}

结果字符串是:

program.exe "C:\users\foo\input file.txt" "output.txt"

这是文档

于 2019-11-09T23:50:50.163 回答