0

私は次のsql_buildup_methodを取得しました...コードは少し汚れていますが、そうではありません

char *build_up_sql(char *inputName,char *inputMessage)
{
   char firstPartStatement[1064] ="INSERT INTO User (name, msg) VALUES (";
    char *endPartStatement =");";
    char *lightener = "'";  
    char *statement;

strcat(firstPartStatement,lightener);
strcat(firstPartStatement,inputName);
strcat(firstPartStatement,lightener);
strcat(firstPartStatement,",");
strcat(firstPartStatement,lightener);
strcat(firstPartStatement,inputMessage);
strcat(firstPartStatement,lightener);
strcat(firstPartStatement,endPartStatement);

statement = firstPartStatement; 

return statement;

}

void create_input(sqlite3 *handler,char *inputName,char *inputMessage)
{
    char *sql;

    sql = build_up_sql(inputName,inputMessage);
 // sql ="INSERT INTO User (name, msg) VALUES ('Susanne','hi all');";   
    printf("%s\n",sql);
    sqlite3_exec(handler,sql, NULL, NULL, NULL);
}

printfは次の出力を提供します。INSERTINTOUser(name、msg)VALUES('Susanne'、'hi all'); これはまったく問題ありません...しかし、sqlite3_execはそれを無視し、新しいデータベース入力を生成しません....行を残すとsql = "INSERT INTO User(name、msg)VALUES('Susanne'、'hi all' ); "; コードでは、sqlite3_execは正常に機能します....すべてを1つの関数に入れることでも問題は解決しましたが、これはオプションではありません.....

4

1 に答える 1

1

ここでの問題は、未定義の動作であるローカル変数へのポインターを返すことです。戻るときbuild_up_sql、ローカル変数用のスタック上のスペースが再利用されます。

最善の解決策は、おそらくbuild_up_sql、文字列を入れるために使用するパラメーターを追加することです。次のようなものです。

char *build_up_sql(char *inputName, char *inputMessage, char *outputSql)
{
    const char firstPartStatement[] = "INSERT INTO User (name, msg) VALUES (";
    const char endPartStatement[] = ");";
    const char lightener[] = "'";

    strcpy(outputSql, firstPartStatement);
    strcat(outputSql,lightener);
    strcat(outputSql,inputName);
    strcat(outputSql,lightener);
    strcat(outputSql,",");
    strcat(outputSql,lightener);
    strcat(outputSql,inputMessage);
    strcat(outputSql,lightener);
    strcat(outputSql,endPartStatement);

    return outputSql;
}

void create_input(sqlite3 *handler, char *inputName, char *inputMessage)
{
    char sql[1024];

    char *sqlstr = build_up_sql(inputName, inputMessage, sql);

    printf("%s\n", sqlstr);
    sqlite3_exec(handler, sqlstr, NULL, NULL, NULL);
}
于 2012-07-18T09:17:26.603 に答える