c++中Python风格的字符串替换
Python style String replacement in C++
在回答Python中的字符串替换是如何工作的问题时显示在这个答案中。
我相信它的工作原理是
string toSql(string table, string field, string value)
{
string out;
return out = "INSERT INTO %s (%s) VALUES (%s)" % (table,field,value);
}
在c++中是否有类似的方法可以在没有文件i/o的情况下做到这一点?
我正试图用这个来形成一个查询SQLite数据库。
编辑
我避免使用外部库。提高交货
同样,输入是由程序而不是用户提供的。所以我不相信我会遇到注入漏洞
为了回答所问的问题,习惯的c++方法是使用std::ostringstream
。请注意,这个流类是由内存支持的,而不是磁盘上的文件。
(还有snprintf()
选项,它看起来更接近Python字符串格式化,但具有C风格的接口,除非有充分的理由,否则不应该从现代c++中使用。如果你在写c++,那就写c++,而不是C)
std::string toSql(
std::string const & table,
std::string const & field,
std::string const & value
) {
std::ostringstream s;
s << "INSERT INTO " << table
<< " (" << field << ") VALUES (" << value << ")";
return s.str();
}
但是,要注意,如果任何参数是未经处理的用户输入,那么可能会使您的程序受到SQL注入攻击。您应该使用一个准备好的语句(sqlite3_prepare()
后面跟着sqlite3_bind_...()
)来将value
绑定到语句中——但是您仍然必须从table
和field
参数中构建字符串,因为数据库对象名称不能以这种方式绑定。
您可以像这样"以c++的方式"使用预处理语句(std::unique_ptr
需要c++ 11或更高版本):
#include <memory>
#include <string>
#include <sqlite3.h>
// Deleter functor to properly sqlite3_finalize() statements when we
// are done with them.
struct sqlite3_stmt_deleter
{
void operator()(sqlite3_stmt * p) const {
sqlite3_finalize(p);
}
};
// Type alias for a std::unique_ptr that uses the above functor to
// clean up statements.
using sqlite3_prepared_stmt = std::unique_ptr<sqlite3_stmt, sqlite3_stmt_deleter>;
sqlite3_prepared_stmt prepare(sqlite3 * db, std::string const & sql)
{
sqlite3_stmt * stmt = nullptr;
// Note that we don't allow the caller to see any error information. A
// proper wrapper will want to throw if the return isn't SQLITE3_OK.
sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr);
return sqlite3_prepared_stmt(stmt);
}
void example() {
auto insert_stmt = prepare(
your_db,
"INSERT INTO foo (bar) VALUES (?)");
std::string value{"baz"};
// Bind value to the ? in the prepared statement
sqlite3_bind_text(insert_stmt.get(), 1, value.c_str(), -1, SQLITE_TRANSIENT);
// Execute statement.
sqlite3_step(insert_stmt.get());
// Reset statement so it can be used again with bind/step.
sqlite3_reset(insert_stmt.get());
// std::unique_ptr destructor will call sqlite3_finalize() for us.
}
使用此代码,您可以将sqlite3_prepared_stmt
存储在某个地方并重用它。
看一下printf函数族。
string toSql( string table, string field, string value )
{
char buffer[ 100 ];
size_t length = sprintf( buffer, "INSERT INTO %s (%s) VALUES (%s)", table.data( ), field.data( ), value.data( ) );
if ( lenght < 0 )
{
//increase buffer size and try again.
}
printf("SQL Query = '%s'n", buffer );
return buffer
}
相关文章:
- 如何使用regex_replace将子字符串替换为字符串中的另一个子字符串,同时保持整个文本完整?
- 使用C++将一个字符串替换为另一个字符串
- 简单的字符串替换给出错误,尽管参数正确
- UnicodeString 将一个子字符串替换为另一个子字符串
- C++字符串.替换生成"No matching function for call"错误
- std::字符串替换不保留结尾?
- GCC Bug,使用尖括号通过宏包含标头时"linux"路径中的字符串"<>"替换为 "1"
- 字符串替换问题
- 将带双引号的字符串替换为带双引号的字符串
- 如何在C++中将字符串替换为"Match case"和"Match whole word"
- 字符串替换和奇怪的字符
- C++中的字符串反转不将旧字符串替换为新字符串
- 用c++字符串替换snprintf
- 字符串::替换在有效的迭代器上抛出 std::out_of_range
- 简单的标准::字符串替换在C++
- C++字符串替换函数无限循环
- 分析字符串替换内存泄漏
- C++:-用另一个字符串替换一段字符串
- 提升字符串替换不会用字符串替换换行符
- C++中任意长度字符串的字符串替换