2017-03-14 294 views
1

enter image description here將值插入到數據庫中後,整數值正確插入,但字符串值被一些垃圾值替換。 使用%s或%q作爲字符串的佔位符。將垃圾值插入SQLite數據庫

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

回答

6

我敢肯定這是不可能的傳遞一個std::string作爲參數傳遞給一個可變參數的功能,使用.c_str()方法您的所有字符串。

SQLite的API是一個 API,所以功能期待的"%s"符一個,該std::string是不一樣的東西,你可以用它通過的.c_str()方法,這是std::string的表示方式的內部數據該對象是有效的


它嚴格說來清楚可能的,因爲你做了,但

  • 這是不確定的行爲,以及垃圾價值就在那裏,因爲函數試圖取消引用std::string,這是爲什麼這是未定義的行爲。

  • 編譯器可能會警告這一點,如果你正在使用GCC這是幾乎可以肯定,這將讓你無論是,忽略了警告或警告,沒有編譯ON。

+0

請您解釋 – kulst

+1

使用.c_str()後問題解決了。但是,gcc編譯器不會警告任何東西。 – kulst