Цитирование строк в переполнении стека

В 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. Используемая техника должна быть совместимой на обеих платформах. Если функции нет, это значит, что я должен написать ее.

0

Решение

String str = "tblCustomers";
str = "'" + str + "'";

Посмотреть больше вариантов Вот

0

Другие решения

Используя 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;

Больше информации о пользовательских литералах

5

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

Как описано в его предложение, это было действительно разработано для кругооборота струн.

4

Нет стандартной функции, если не считать std::basic_string::operator+(), но писать это тривиально.

Я несколько смущен тем, что замедляет тебя — quoted( "cCustomerName" ) больше символов, нет? :>

0

Вы можете использовать свой собственный символ-заполнитель для обозначения кавычки, некоторый символ ASCII, который никогда не будет использоваться, и заменить его на «непосредственно перед выводом строк.

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;
}

С этим вы получаете то, что хотите.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector