-1
我試圖運行此代碼,但是當我嘗試添加新代理時,只要我在控制檯上輸入IP地址作爲輸入,程序退出並拋出一個錯誤,說分段錯誤。我使用了一個字符數組來存儲IP地址。 我不知道如何將用戶輸入作爲參數提供給sql插入查詢。如何將用戶輸入作爲sql語句的參數
#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\t", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(char c, char* argv[])
{
sqlite3 *db;
int rc;
char *zErrMsg = 0;
char *sql;
int choice;
char option;
int port,priority;
char *nameID,*ip;
rc = sqlite3_open("topology.cnf", &db);
if(rc){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
// Creation of table
sql = "CREATE TABLE BROKERLIST(" \
"IP CHAR(16) PRIMARY KEY NOT NULL," \
"PORT INT NOT NULL," \
"NAMEID TEXT NOT NULL," \
"PRIORITY INT NOT NULL);";
// Executing 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");
}
do{
printf("Enter choice \n1.Add broker\t2.Remove broker\t3.Change broker priority\t4.Show map");
scanf("%d", &choice);
switch(choice){
case 1: printf("\nEnter IP, Port, NameID, Priority");
scanf("%s%d%s%d",ip,&port,nameID,&priority);
sql = "INSERT INTO BROKERLIST(IP,PORT,NAMEID,PRIORITY) " \
"VALUES('"+ip+"','"+port+"','"+nameID+"','"+priority+"'); " ;
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, "Added broker successfully\n");
}
break;
case 2: printf("\nEnter NameID of the broker to be removed");
scanf("%s",nameID);
sql = "DELETE from BROKERLIST where NAMEID = '"+nameID+"'; " ;
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, "Removed broker successfully\n");
}
break;
case 3: printf("\nEnter NameID of broker whose priority has to be changed and the new priority");
scanf("%s%d",nameID,&priority);
sql = " UPDATE BROKERLIST set PRIORITY = '"+priority+"' where NAMEID = '"+nameID+"'; ";
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, "Updated Priority of broker\n");
}
break;
case 4: sql = "SELECT * from BROKERLIST" ;
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
break;
}
printf("\n Do you want to continue?(Y/N)");
fflush(stdin);
scanf("%c",&option);
}while(option == 'Y' || option == 'y');
return 0;
}
我試過,但現在我得到的錯誤是sql語句。我將參數以''參數''的形式提供給查詢,並且拋出錯誤。 – Nikhila