Я пытаюсь заполнить 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 вместо чтения его с помощью зсапЕ(). Может кто-нибудь объяснить, почему это происходит?
Это работает спасибо! Просто из любопытства. Можете ли вы объяснить, почему он всегда пропустил последний fget последней итерации цикла? – SivaDotRender
Правильно, потому что символ новой строки не только указывает конец целого числа, либо что-то другое, но также хранится в буфере. Он не автоматически потребляется. Fgets считывает n входных символов из буфера, пока не будет найдена новая строка. В вашем случае первый символ - символ новой строки, который оставлен в буфере, поэтому вы получаете строку «\ n». – KostasT
@SivaDotRender Самый простой способ понять это с помощью примера. Предположим, что num_inputs равно 1. Тогда первые fgets сразу прочитают новую строку. Затем следующий fgets будет читать секрет (вместо encoded_message). В этот момент цикл заканчивается, и у вас закончилась одна дополнительная строка ввода, которая не была прочитана. – kaylum