2014-04-15 4 views
0

다음 코드 (단지 관련 부분이 표시됩니다), 나는 오류 메시지가 얻을 것이다 실행하면" "순서가 호출 라이브러리 루틴을C++ : "순서가 호출 라이브러리 루틴

// Open database 
char *lang = "Spanish"; 
char *DBName = "Spanish.db"; 
sqlite3 *db; 
int sqlret; 

sqlret = sqlite3_open(DBName, &db); 

if (sqlret != SQLITE_OK) { 
    printf("Can't open database: %s \n", sqlite3_errmsg(db)); 
    sqlite3_close(db); 
    return 1; 
} 

// Create Table 

sqlite3_stmt *stmt; 
char *sqlcommand; 
sqlcommand = new char; 

Start(sqlcommand, lang); 

printf(sqlcommand); 

sqlret = sqlite3_prepare_v2(db, sqlcommand, -1, &stmt, NULL); 

if (sqlret != SQLITE_OK) { 
    printf("Error: %s \n", sqlite3_errmsg(db)); 
    sqlite3_close(db); 
    return 2; 
} 
합니다. 나는 내가 의미하는 것은 (정의 SqlCommand를 동적으로하지만, 정적하지 않는 경우, 그러나

void Start(char *command, char *language) { 

sprintf(command,"CREATE TABLE IF NOT EXISTS 'Vocabulary' ("\ 
       "'%s' TEXT NOT NULL, ", language); 
strcat(command, "'Native Language' TEXT NOT NULL, " \ 
       "'Times Asked' INT NOT NULL, " \ 
       "'Times Correct' INT NOT NULL, " \ 
       "'Times Wrong' INT NOT NULL);"); 
} 

:

시작 (a, b)는 다음과 같은 기능입니다 문자 *하는 SqlCommand = "CREATE ...";), 도와 주시면 감사하겠습니다.

+0

단지 니트릭 : 거기에 단지 C가 없다. –

+0

@JoachimPileborg : 틀렸어. '새로운 것'(심지어 범인 인 것 같다) : –

답변

1

sqlcommand = new char;

이 코드는 하나의 메모리에 문자를 할당합니다. 그건 그렇고 절대로 삭제할 수 없습니다.

당신은 하나의 문자 만 전체 문자열을 원하지 않는

. 기술적으로 이것은 new[]delete[] 호출 쌍이 필요하다는 것을 의미합니다. 그러나 C++에서는 원시 문자열을 사용하지 않아도됩니다. 당신은 확실히 여기에 그들을 사용할 필요가 없습니다.

사용 std::string 대신!

이렇게하면 하위 수준 sprintfstrcat 기능을 제거 할 수 있습니다.

한마디로
std::string sqlcommand = Start(lang); 
sqlret = sqlite3_prepare_v2(db, sqlcommand.c_str(), -1, &stmt, NULL); 

, 당신은 정말 문자열을 사용 배울 필요가 :

같은 SQLite는 API의 것과 같은 C의 기능과의 호환성을 위해
std::string Start(std::string const &language) 
{ 
    return "CREATE TABLE IF NOT EXISTS 'Vocabulary' ("\ 
     "'" + language + "' TEXT NOT NULL, " 
     "'Native Language' TEXT NOT NULL, " 
     "'Times Asked' INT NOT NULL, " 
     "'Times Correct' INT NOT NULL, " 
     "'Times Wrong' INT NOT NULL);" 
} 

std::stringc_str() 멤버 함수를 제공합니다 : 여기 결과는 C++에서. 당신의 인생은 : 상당히 쉬워 질 것이다


편집 : 그냥이 당신이 그것을 잘못된 char 포인터를 통과하기 때문에 ... 당신은 분명히 경험 오류 메시지가, SQLite는 내부에 정의되지 않은 동작에서 유래를 언급 (하나 C++에서 잊어 버릴 수있는 또 다른 C 언어).

+0

프로세스가 분명히 한 것을 감안할 때 충돌하지 않는다면,'char *'는 ('sprintf'와'strcat')에 의해 NUL- 종료 될 것입니다. 그러나 그곳의 힙에있는 것은 무엇이든지 버리는 것입니다. –

+0

@AndrewMedico : 가장 정확한 것은 sprintf 호출이 이미 UB를 산출한다는 것입니다. –

관련 문제