2013-10-07 4 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 fault, может кто-то объяснить мне, что я делаю неправильно, и различия в том, что происходит в памяти, когда я инициализирую эту переменную?

ответ

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

ummm ... Вы видели тег 'C'? – P0W

+0

Я видел, но некоторые из тех же вопросов касаются новичков, и я предпочитаю их учить. – PersianGulf