2015-04-21 2 views
0

Я пытаюсь заполнить 2 массива, используя fgets. По какой-то причине последний fget последней итерации цикла никогда не выполняется.последние fgets в цикле никогда не выполняются

Например, если num_inputs = 5, считываются только 9 строк (вместо 10).

int num_imputs; 

//read the number of inputs 

scanf("%d", &num_imputs); 

char secret_arr[num_imputs][8];//stores all the secrets 
char encoded_message_arr[num_imputs][256];//stores all the encoded messages 

for(int i = 0; i < num_imputs ; i++){ 

    fgets (secret_arr[i],8, stdin); 
    fgets (encoded_message_arr[i],256, stdin); 

} 

Этот код работает отлично найти, если я жёстко num_inputs вместо чтения его с помощью зсапЕ(). Может кто-нибудь объяснить, почему это происходит?

ответ

3

Вам не хватает строки в строке scanf (при условии, что на вашем вводе введено значение для ввода данных num_inputs). Результаты в первых fgets фактически сохраняют пустую строку, когда она останавливается, когда видит новую строку, которая была частью записи данных num_inputs.

Должно быть:

scanf("%d\n", &num_imputs); 
+0

Это работает спасибо! Просто из любопытства. Можете ли вы объяснить, почему он всегда пропустил последний fget последней итерации цикла? – SivaDotRender

+1

Правильно, потому что символ новой строки не только указывает конец целого числа, либо что-то другое, но также хранится в буфере. Он не автоматически потребляется. Fgets считывает n входных символов из буфера, пока не будет найдена новая строка. В вашем случае первый символ - символ новой строки, который оставлен в буфере, поэтому вы получаете строку «\ n». – KostasT

+1

@SivaDotRender Самый простой способ понять это с помощью примера. Предположим, что num_inputs равно 1. Тогда первые fgets сразу прочитают новую строку. Затем следующий fgets будет читать секрет (вместо encoded_message). В этот момент цикл заканчивается, и у вас закончилась одна дополнительная строка ввода, которая не была прочитана. – kaylum