В 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\""];
Как и выше, мне приходится часто заключать в кавычки строки. Печатание этого в некотором роде замедляет меня. Есть ли стандартная функция, которую я могу использовать для этого?
Кстати, я разрабатываю с использованием Ubuntu / Windows с Code :: Blocks. Используемая техника должна быть совместимой на обеих платформах. Если функции нет, это значит, что я должен написать ее.
String str = "tblCustomers";
str = "'" + str + "'";
Посмотреть больше вариантов Вот
Используя 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;
C ++ 14 добавлено std::quoted
который делает именно это, и более точно: он заботится о экранировании кавычек и обратной косой черты в выходных потоках и об их удалении во входных потоках. Он эффективен, потому что он не создает новую строку, это действительно манипулятор ввода-вывода. (Таким образом, вы не получите строку, как вам хотелось бы.)
#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"\
}
Как описано в его предложение, это было действительно разработано для кругооборота струн.
Нет стандартной функции, если не считать std::basic_string::operator+()
, но писать это тривиально.
Я несколько смущен тем, что замедляет тебя — quoted( "cCustomerName" )
больше символов, нет? :>
Вы можете использовать свой собственный символ-заполнитель для обозначения кавычки, некоторый символ ASCII, который никогда не будет использоваться, и заменить его на «непосредственно перед выводом строк.
#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;
}
С этим вы получаете то, что хотите.