2013-10-07 164 views
1

我正在爲我的C課程工作,我試圖接受用戶的輸入並將其存儲在一個變量中,以便稍後在我的代碼中使用。這是我的主要功能是什麼樣子,Scanf Seg Fault

int main() { 
    // Variables here 
    char* inputLine[10]; 

    do { 
     printf("Insert number...."); 
     scanf("%s\n", inputLine); 
     // More stuff here 
    } 
    return 0; 
} 

此代碼給了我一堆警告,warning: format specifies type 'char *' but the argument has type 'char **' [-Wformat]的,如果我改變的變量聲明,

char* inputLine = NULL; 

當我執行我的代碼,我收到了seg故障,有人可以向我解釋我做錯了什麼,以及當我初始化這個變量時內存中發生了什麼的區別?

回答

5

char* inputLine[10];

- >是十個指針char

的printf的格式%s陣列預計char *類型的參數,但你提供這類型char **

只需使用

char inputLine[10];

爲了避免可能的緩衝區溢出,你應該使用

scanf("%9s", inputLine); //Notice the size with %s

9只是因爲C字符串是空終止('\0'),所以它一個額外的字節,在結束後進入

+0

+1和變硬,與在格式說明長度說明,以防止緩衝區溢出。 – WhozCraig

+0

@WhozCraig謝謝更新:D – P0W

3
char inputLine[10]; 

do { 
    printf("Insert number...."); 
    scanf("%9s\n", inputLine); 
    // More stuff here 
} while(//some condition); 
+1

爲了更好地保持安全,請執行'scanf(「%9s \ n」,inputLine);'。 – alk

+0

@alk;是。你是對的。 – haccks

0

但是,如果您編輯代碼和刪除*你會得到答案,但正常的陣列已棄用,現在,程序員使用vector,normal array in C not safe

#include <iostream> 
#include <vector> 
using namespace std; 
int main() { 

    vector<string> inputLine; 

您每次data type定義:

vector<int> myvar; 

,也可以定義多維vector

vector< vector <int> > myvar; 
+0

嗯......你看到'C'標籤嗎? – P0W

+0

我看到了,但一些相同的問題是初學者,我preffer教他們。 – PersianGulf