C++中的Python风格字符串替换

2024-03-29 01:53:17 发布

您现在位置:Python中文网/ 问答频道 /正文

它显示在thisanswer中,以回答其在Python中如何替换字符串的问题。在

我相信它的工作原理

string toSql(string table, string field, string value)
{
    string out;
    return out = "INSERT INTO %s (%s) VALUES (%s)" % (table,field,value);
}
在没有文件I/O的情况下,C++中有类似的方法吗?在

我试图用它来对SQLite数据库进行查询。在

编辑

我避免使用外部库。前增压

此外,输入来自程序,而不是用户。所以我不相信我会遇到注入漏洞


Tags: 文件字符串fieldstringreturnvaluetable情况
2条回答

看看函数的printf family。在

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
}
<> P>为了回答被问及的问题,习惯的C++方式是^ ^ }。注意,这个流类是由内存支持的,而不是磁盘上的文件。在

<^ >(还有{{CD2>}选项),它看起来更接近Python字符串格式,但有C风格的接口,不应该从现代C++中使用,没有充分的理由。如果你正在写C++,那么写C++,而不是C)/P>
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绑定到语句中,但是您仍然必须从tablefield参数构建字符串,因为这样无法绑定数据库对象名。在


可以使用准备好的语句“C++方式”(C++ 11或更好的^ ^ }):

^{pr2}$

使用此代码,您可以将sqlite3_prepared_stmt存储在某个地方并重用它。在

相关问题 更多 >