我正在尝试使用sqlite创建一个电话簿,我收到编译错误,我能够调试一些语法错误,但我现在遇到的问题是确保纠正了以下错误。
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for(i = 0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("...................................................\n");
return 0;
int main(int argc, char* argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data = "Callback function called";
if (argc == 3 && (0 == strcmp(argv[1], "-f"))) {
if(argc == 1){
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
/* Create SQL statement */
sql = "CREATE TABLE CONTACTS(" \
"ID INT PRIMARY KEY NOT NULL," \
"FIRSTNAME TEXT NOT NULL," \
"LASTNAME TEXT NOT NULL," \
"MOBILEPHONE TEXT NOT NULL," \
"CITY TEXT NOT NULL," \
"ADDRESS CHAR(50)," \
"COUNTRY TEXT );";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Table created successfully\n");
}
sqlite3_close(db);
return 0;
}
}
}
}
void MainMenu()
{
int optn; // option value
int valid; //check if option is valid
system("clear");
valid = 0;
while( valid == 0 )
{
printf("---------------DELIMITER---------------\n");
printf("Phone book Menu\n");
printf("(1) Add new record to phone book\n");
printf("(2) Search phone book\n");
printf("(3) Update phone book\n");
printf("(4) Delete record from phone book\n");
printf("(5) Quit\n");
printf("---------------DELIMITER---------------\n");
printf("Please choose your operation: ");
if(scanf("%d", &optn) == 1)
{
if(optn > 0 && optn < 6)
{
valid = 1;
}else{
printf("Error: Invalid option selected, please try again\n\n");
}
}
//start the operations
if(optn == 1)
{
AddMenu();
}else if (optn == 2)
{
SearchMenu();
}else if (optn == 3)
{
UpdateMenu();
}else if (optn == 4)
{
DeleteMenu();
}else{
exit(0);
}
}
}
//search menu
void SearchMenu()
{
int optn; // option value
int valid; //check if option is valid
int display_search; //allow csv file export
char ch; //repeat option value
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data;
printf("\tSearch PhoneBook\n");
printf("================================\n\n");
valid = 0;
while( valid == 0 )
{
printf("Select a search option:\n");
printf("-----------------------\n");
printf(" 1) Display search result\n");
printf(" 2) Back\n\n");
printf("Choose an option: ");
if(scanf("%d", &optn) == 1)
{
if(optn > 0 && optn < 3)
{
valid = 1;
}else{
printf("Error: Invalid option selected, please try again\n\n");
}
}
//start the operations
if(optn == 1)
{
sql = "SELECT * from CONTACTS";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return;
}
}
}
void AddMenu()
{
char *sql;
char statement[512];
char *fname = malloc(50);
char *lname = malloc(50);
char *city= malloc(50);
char *country= malloc(50);
sqlite3 *db;
char *zErrMsg = 0;
int rc;
printf("Enter the First Name: ");
scanf("%[^\n]s", fname);
printf("Enter the Last Name: ");
scanf("%[^\n]s", lname);
printf("Enter the Mobile Phone: ");
scanf("%[^\n]s", mobile);
printf("Enter the City: ");
scanf("%[^\n]s", city);
printf("Enter the Country: ");
scanf("%[^\n]s", country);
//run SQL Statements
sql = "INSERT INTO CONTACT (FirstName,LastName,MobilePhone,City,Country) " \
"VALUES ('%s','%s','%s','%s','%s' );";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Records created successfully\n");
}
sqlite3_close(db);
return;
}
void UpdateMenu()
{
char id;
int valid;
char *fname = malloc(50);
char *lname = malloc(50);
char *mobile= malloc(20);
char *city= malloc(50);
char *country= malloc(50);
char statement[512];
char values_cut[512];
char fname_out[50];
char lname_out[50];
char mobile_out[20];
char city_out[50];
char country_out[50];
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data;
if(do_search(0) == 0){
valid = 0;
while( valid == 0 )
{
printf("Enter the Number you want to update: ");
if(scanf("%s", &id) == 1)
{
if(id > 0 )
{
valid = 1;
printf("\nUpdate the values, press enter if you do not want to change a field\n");
printf("---------------------------------------------------------------------\n");
//get the update values
printf("Enter the First Name: ");
if((scanf("%[^\n]s", fname) != 0)){
snprintf(fname_out, sizeof fname_out, "FirstName='%s',",fname);
}else{
snprintf(fname_out,sizeof fname_out, "");
}
fname = fname_out;
printf("Enter the Last Name: ");
if((scanf("%[^\n]s", lname)!=0)){
snprintf(lname_out,sizeof lname_out, "LastName='%s',",lname);
}else{
snprintf(lname_out,sizeof lname_out, "");
}
lname=lname_out;
printf("Enter the Mobile Phone: ");
if((scanf("%[^\n]s", mobile)!=0)){
snprintf(mobile_out,sizeof mobile_out, "MobilePhone='%s',",mobile);
}else{
snprintf(mobile_out,sizeof mobile_out, "");
}
mobile=mobile_out;
printf("Enter the City: ");
if((scanf("%[^\n]s", city)!=0)){
snprintf(city_out,sizeof city_out, "City='%s',",city);
}else{
snprintf(city_out,sizeof city_out, "");
}
city=city_out;
printf("Enter the Country: ");
if((scanf("%[^\n]s", country)!=0)){
snprintf(country_out,sizeof country_out, "Country='%s',",country);
}else{
snprintf(country_out,sizeof country_out, "");
}
country=country_out;
//remove the last comma from the query
snprintf(values_cut,sizeof values_cut, "%s%s%s%s%s",fname,lname,mobile,city,country);
}
}
/* Create merged SQL statement */
sql = "UPDATE CONTACT set %s where ID=%s";
"SELECT * from CONTACT where ID=%s";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return;
}
}
}
//Delete menu
void DeleteMenu()
{
int valid;
int id, good;
char *sql;
char statement[512];
sqlite3 *db;
char *zErrMsg = 0;
int rc;
const char* data;
int optn;
//search first
if(do_search(0)==0){
valid = 0;
while( valid == 0 )
{
printf("Enter the number you want to delete: ");
if(scanf("%s", &id) == 1)
{
if(id > 0 )
{
valid = 1;
/* Create merged SQL statement */
sql = "DELETE from CONTACT where ID=%s; " \
"SELECT * from CONTACT";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return;
}
}while(optn!=5);
}
}
}
}
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for(i = 0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("...................................................\n");
return 0;
int main(int argc, char* argv[]) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data = "Callback function called";
if (argc == 3 && (0 == strcmp(argv[1], "-f"))) {
if(argc == 1){
rc = sqlite3_open("test.db", &db);
if( rc ) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
} else {
/* Create SQL statement */
sql = "CREATE TABLE CONTACTS(" \
"ID INT PRIMARY KEY NOT NULL," \
"FIRSTNAME TEXT NOT NULL," \
"LASTNAME TEXT NOT NULL," \
"MOBILEPHONE TEXT NOT NULL," \
"CITY TEXT NOT NULL," \
"ADDRESS CHAR(50)," \
"COUNTRY TEXT );";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Table created successfully\n");
}
sqlite3_close(db);
return 0;
}
}
}
}
void MainMenu()
{
int optn; // option value
int valid; //check if option is valid
system("clear");
valid = 0;
while( valid == 0 )
{
printf("---------------DELIMITER---------------\n");
printf("Phone book Menu\n");
printf("(1) Add new record to phone book\n");
printf("(2) Search phone book\n");
printf("(3) Update phone book\n");
printf("(4) Delete record from phone book\n");
printf("(5) Quit\n");
printf("---------------DELIMITER---------------\n");
printf("Please choose your operation: ");
if(scanf("%d", &optn) == 1)
{
if(optn > 0 && optn < 6)
{
valid = 1;
}else{
printf("Error: Invalid option selected, please try again\n\n");
}
}
//start the operations
if(optn == 1)
{
AddMenu();
}else if (optn == 2)
{
SearchMenu();
}else if (optn == 3)
{
UpdateMenu();
}else if (optn == 4)
{
DeleteMenu();
}else{
exit(0);
}
}
}
//search menu
void SearchMenu()
{
int optn; // option value
int valid; //check if option is valid
int display_search; //allow csv file export
char ch; //repeat option value
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data;
printf("\tSearch PhoneBook\n");
printf("================================\n\n");
valid = 0;
while( valid == 0 )
{
printf("Select a search option:\n");
printf("-----------------------\n");
printf(" 1) Display search result\n");
printf(" 2) Back\n\n");
printf("Choose an option: ");
if(scanf("%d", &optn) == 1)
{
if(optn > 0 && optn < 3)
{
valid = 1;
}else{
printf("Error: Invalid option selected, please try again\n\n");
}
}
//start the operations
if(optn == 1)
{
sql = "SELECT * from CONTACTS";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return;
}
}
}
void AddMenu()
{
char *sql;
char statement[512];
char *fname = malloc(50);
char *lname = malloc(50);
char *city= malloc(50);
char *country= malloc(50);
sqlite3 *db;
char *zErrMsg = 0;
int rc;
printf("Enter the First Name: ");
scanf("%[^\n]s", fname);
printf("Enter the Last Name: ");
scanf("%[^\n]s", lname);
printf("Enter the Mobile Phone: ");
scanf("%[^\n]s", mobile);
printf("Enter the City: ");
scanf("%[^\n]s", city);
printf("Enter the Country: ");
scanf("%[^\n]s", country);
//run SQL Statements
sql = "INSERT INTO CONTACT (FirstName,LastName,MobilePhone,City,Country) " \
"VALUES ('%s','%s','%s','%s','%s' );";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Records created successfully\n");
}
sqlite3_close(db);
return;
}
void UpdateMenu()
{
char id;
int valid;
char *fname = malloc(50);
char *lname = malloc(50);
char *mobile= malloc(20);
char *city= malloc(50);
char *country= malloc(50);
char statement[512];
char values_cut[512];
char fname_out[50];
char lname_out[50];
char mobile_out[20];
char city_out[50];
char country_out[50];
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
const char* data;
if(do_search(0) == 0){
valid = 0;
while( valid == 0 )
{
printf("Enter the Number you want to update: ");
if(scanf("%s", &id) == 1)
{
if(id > 0 )
{
valid = 1;
printf("\nUpdate the values, press enter if you do not want to change a field\n");
printf("---------------------------------------------------------------------\n");
//get the update values
printf("Enter the First Name: ");
if((scanf("%[^\n]s", fname) != 0)){
snprintf(fname_out, sizeof fname_out, "FirstName='%s',",fname);
}else{
snprintf(fname_out,sizeof fname_out, "");
}
fname = fname_out;
printf("Enter the Last Name: ");
if((scanf("%[^\n]s", lname)!=0)){
snprintf(lname_out,sizeof lname_out, "LastName='%s',",lname);
}else{
snprintf(lname_out,sizeof lname_out, "");
}
lname=lname_out;
printf("Enter the Mobile Phone: ");
if((scanf("%[^\n]s", mobile)!=0)){
snprintf(mobile_out,sizeof mobile_out, "MobilePhone='%s',",mobile);
}else{
snprintf(mobile_out,sizeof mobile_out, "");
}
mobile=mobile_out;
printf("Enter the City: ");
if((scanf("%[^\n]s", city)!=0)){
snprintf(city_out,sizeof city_out, "City='%s',",city);
}else{
snprintf(city_out,sizeof city_out, "");
}
city=city_out;
printf("Enter the Country: ");
if((scanf("%[^\n]s", country)!=0)){
snprintf(country_out,sizeof country_out, "Country='%s',",country);
}else{
snprintf(country_out,sizeof country_out, "");
}
country=country_out;
//remove the last comma from the query
snprintf(values_cut,sizeof values_cut, "%s%s%s%s%s",fname,lname,mobile,city,country);
}
}
/* Create merged SQL statement */
sql = "UPDATE CONTACT set %s where ID=%s";
"SELECT * from CONTACT where ID=%s";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return;
}
}
}
//Delete menu
void DeleteMenu()
{
int valid;
int id, good;
char *sql;
char statement[512];
sqlite3 *db;
char *zErrMsg = 0;
int rc;
const char* data;
int optn;
//search first
if(do_search(0)==0){
valid = 0;
while( valid == 0 )
{
printf("Enter the number you want to delete: ");
if(scanf("%s", &id) == 1)
{
if(id > 0 )
{
valid = 1;
/* Create merged SQL statement */
sql = "DELETE from CONTACT where ID=%s; " \
"SELECT * from CONTACT";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
return;
}
}while(optn!=5);
}
}
}
}
我将很感激地解释错误并提供一些解决方案
gcc insertno.c -o insertno -lsqlite3
当我使用
在putty上编译这个c代码时/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20):
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20):
我在下面收到此错误,非常感谢解决方案。谢谢
{{1}}
答案 0 :(得分:3)
您的函数callback()
的正文尚未正确关闭。
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for(i = 0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("...................................................\n");
return 0;
} // THIS WAS MISSING
GCC在callback()
函数中遇到函数定义时没有标记错误的原因是GCC有一个名为nested functions的扩展名。