A citar textos em C++
em Pascal Lazarus / Delphi, temos uma função QuotedStr() que envolve qualquer cadeia dentro de aspas simples.
aqui está um exemplo do meu código C++ actual:
//I need to quote tblCustomers
pqxx::result r = txn.exec( "Select * from \"tblCustomers\" ");
Outro:
//I need to quote cCustomerName
std::cout << "Name: " << r[a]["\"cCustomerName\""];
semelhante ao acima, eu tenho que frequentemente aspas duplas. Digitar isto está a atrasar-me. Há alguma função padrão que eu possa usar para isso?
BTW, eu desenvolvi usando Ubuntu / Windows Com Código:: Blocos. A técnica utilizada deve ser compatível em ambos os casos. plataforma. Se não há função, isto significa que tenho de escrever uma.
6 answers
String str = "tblCustomers";
str = "'" + str + "'";
Veja Mais opções aqui
Se usar o C++11, poderá criar literais definidos pelo utilizador como este:
#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;
}
Resultado:
"tblCustomers"
"cCustomerName"
Pode até definir o operador com um nome mais curto, se quiser, por exemplo:
std::string operator"" _q(const char* text, std::size_t len) { /* ... */ }
// ...
std::cout << "tblCustomers"_q << std::endl;
Mais informações sobre os literais definidos pelo utilizador
O C++14 adicionou std::quoted
o que faz exatamente isso, e mais na verdade: ele tem o cuidado de escapar de citações e recuos em fluxos de saída, e de desclassificá-los em fluxos de entrada. É eficiente, na medida em que não cria uma nova corda, é realmente um manipulador IO. (Então você não tem um fio, como você gostaria.)
#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";
}
Dá
{\Hello "Wörld"\
}
{"\\Hello \"Wörld\"\\
"}
{\Hello "Wörld"\
}
Tal como descrito em a sua proposta, foi realmente concebida para o rebentamento de cordas.
Nenhuma Função padrão, a menos que você conte std::basic_string::operator+()
, mas escrever é trivial.
Poderá usar o seu próprio carácter de substituição para representar a citação, algum símbolo ASCII que nunca será usado, e substituí-lo por " pouco antes de enviar as cadeias de caracteres.
#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;
}
Com isto consegues o que queres.