字符串列中的值只要是不带空格的一组字符就会添加,即 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");
它停止等待输入,因此无法在那里添加数据:)
这里你遇到的问题不是 SQLite,而是读取
scanf("%s"...
一个单词的问题。第二个保留在输入缓冲区中并在接下来读取scanf("%s"...
。有
fgets
,gets_s
或各种依赖于编译器的东西,例如getline
. 使用它们。