Проблема при добавления значения столбца в таблицу 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 шт):

Автор решения: Harry

Здесь у вас проблема не в SQLite, а в том, что scanf("%s"... читает одно слово. Второе остается в буфере ввода и считывается следующим scanf("%s"....

Есть fgets, gets_s или разные компиляторо-зависимые вещи типа getline. Пользуйтесь ими.

→ Ссылка