2016-10-29 28 views
-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; 
} 

回答

0

您尚未分配任何內存來存儲IP或名稱ID。你剛剛分配了指針,指向哪裏,所以scanf正在寫入一些隨機位置並導致程序崩潰。

最簡單的解決方法是改變:

char *nameID,*ip; 

到:

char nameID[100]; 
char IP[100]; 

假設當然100是比用戶更加會輸入。

+0

我試過,但現在我得到的錯誤是sql語句。我將參數以''參數''的形式提供給查詢,並且拋出錯誤。 – Nikhila

相關問題