Проблема при добавления значения столбца в таблицу SQLite
Значения в столбцы строк добавляются, пока это набор символов без пробела, т. е. 2024, Moscow, plant и т. д., но если добавить, к примеру, Moscow plant, то, в столбце остаётся только первое слово, второе переносится на следующий, не позволяя ввести туда данные (работа скрипта завершается с успехом). Вот мой код:
#include <sqlite3.h>
#include <stdio.h>
int add(void)
{
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("plants.db", &db);
if (rc != SQLITE_OK)
{
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
char sql[1024]; /* make room to hold sql string */
char year[300], source[300], type[300], familia[300], taxon[300], other[300];
printf("Enter year and press enter: \n");
scanf("%s", &year);
printf("Enter sourse and press enter: \n");
scanf("%s", &source);
printf("Enter type and press enter: \n");
scanf("%s", &type);
printf("Enter familia and press enter: \n");
scanf("%s", &familia);
printf("Enter taxon and press enter: \n");
scanf("%s", &taxon);
printf("Enter other and press enter: \n");
scanf("%s", &other);
sprintf(sql, "INSERT INTO numbers (year, source, type, familia, taxon, other) VALUES('%s', '%s', '%s', '%s', '%s', '%s');", year, source, type, familia, taxon, other);
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK )
{
printf("SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
printf("data inserted\n");
return 0;
}
Я не могу понять, почему нельзя вводить слова отбитые пробелами. Причём, вручную, через SQLite Browser, например, всё нормально добавляется, стало быть, проблема не в таблицеВ чём может быть проблема? В остальном скрипт прекрасно справляется с задачей.
Дополнение
Я отредактировал код, вот собственно, изменения:
printf("Enter year and press enter: \n");
fgets(year, sizeof(year), stdin);
printf("Enter sourse and press enter: \n");
fgets(source, sizeof(source), stdin);
printf("Enter type and press enter: \n");
fgets(type, sizeof(type), stdin);
printf("Enter familia and press enter: \n");
fgets(familia, sizeof(familia), stdin);
printf("Enter taxon and press enter: \n");
fgets(taxon, sizeof(taxon), stdin);
printf("Enter other and press enter: \n");
fgets(other, sizeof(other), stdin);
sprintf(sql, "INSERT INTO numbers (year, source, type, familia, taxon, other) VALUES('?', '?', '?', '?', '?', '?');", year, source, type, familia, taxon, other);
Но, при этом, printf("Enter year and press enter: \n");
перестало ждать ввода, в связи с чем, добавить туда данные не выходит :)
Ответы (1 шт):
Здесь у вас проблема не в SQLite, а в том, что scanf("%s"...
читает одно слово. Второе остается в буфере ввода и считывается следующим scanf("%s"...
.
Есть fgets
, gets_s
или разные компиляторо-зависимые вещи типа getline
. Пользуйтесь ими.