垃圾值被插入到SQLite数据库中

kul*_*lst 1 c++ sqlite

在此输入图像描述将值插入数据库,正确插入整数值,但字符串值被某些垃圾值替换. 使用%s或%q作为字符串的占位符.

int sl_no1 = sl_no;
    int ac_no1 = account_no;
    string u_name = name;
    string u_add = address;
    int u_bal = bal;
    cout<<sl_no1<<endl<<ac_no1<<endl<<u_name<<endl<<u_add<<endl<<u_bal;

    /** Create SQL statement */
   //sql = "INSERT INTO ACCOUNT (SL_NO,ACCOUNT_NO, NMAE, ADDRESS, BALANCE) VALUES (" << sl_no1 <<", '"<< ac_no1 <<",'" << u_name <<", '"<< u_add <<", '" << u_bal << "')";
    sql = sqlite3_mprintf("INSERT INTO ACCOUNT VALUES('%d','%d','%q','%q','%d' )", sl_no1,ac_no1,u_name, u_add, u_bal);

    /** Execute SQL statement */
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else
    {
        fprintf(stdout, "Records created successfully\n");
    }
Run Code Online (Sandbox Code Playgroud)

Iha*_*imi 6

我肯定这是不可能的1传递一个std::string作为参数传递给一个可变参数的功能,使用.c_str()为您的所有字符串方法.

sqlite API是一个 API,所以函数期望一个用于说明"%s"符,这std::string不是一回事,你可以通过方法使用它的内部数据,这些.c_str()方法std::string是有效的对象的表示.


1严格说来,因为你做了,但是

  • 它是UNDEFINED BEHAVIOR,并且垃圾值就在那里,因为函数试图取消引用std::string,这就是为什么它是未定义的行为.

  • 编译器可能会对此发出警告,如果您正在使用gcc,那么它几乎可以肯定它会如此,您可以忽略警告或编译而不会发出警告ON.