2016-10-29 2 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

関連する問題