2017-02-15 27 views
0

Проблема в том, что fgets не принимает значения в первой итерации цикла. Просто пропуская его. Как я вижу это. Я получаю, что в моем коде есть какая-то основная ошибка, но я этого не вижу. Fgets начинает принимать значения только на 2-й итерации.Fgets - не работает в цикле

#include <stdio.h> 
#include <string.h> 
#include <math.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int t; 
    scanf("%i", &t); 

    char ways[100]; 
    for (int j = 0; j <= t; t++) 
    { 
     fgets (ways, 100, stdin); 
     printf("Ways = %s\n", ways); 
    } 

    return 0; 
}` 
+0

Пожалуйста, исправьте форматирование вашего вопроса. Обратите внимание, что # include отсутствует в вашем коде. –

+5

Поскольку первый 'scanf' оставляет' newline' во входном буфере для 'fgets' для чтения - не смешивайте свои методы! Введите 't' с' fgets' и 'sscanf'. –

+1

«gets не принимает значения в первой итерации цикла» -> Да, это так. 'fgets()' "взял" '\ n'' из предыдущей строки. – chux

ответ

-2

scanf() считывает цифры, введенные uder, и оставляя в буфере его конечные пробелы и новую строку. Затем fgets() считывает их и, таким образом, считывает пустую строку на первой итерации.

Чтобы исправить добавление символа пробела после% i. Пробел сопоставляет пробелы с scanf.

+1

Белое пространство в конце строки формата будет продолжать соответствовать символам пробела до тех пор, пока не встретится символ небелого пробела, в результате чего вход будет висеть. –

1

Самый простой способ исправить вашу проблему - использовать fgets() и sscanf(), чтобы прочитать начальный номер. Кроме того, похоже, что ваш цикл имеет пару ошибок. Вероятно, вы имели в виду j < t вместо j <= t, так что цикл выполняет t раз. Кроме того, вы почти наверняка хотели бы увеличить j вместо t, что приведет к бесконечному циклу.

#include <stdio.h> 
#include <string.h> 
#include <math.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int t; 
    char buffer[100]; 
    fgets(buffer, 100, stdin); 
    sscanf(buffer, "%i", &t); 

    char ways[100]; 
    for (int j = 0; j < t; j++) 
    { 
     fgets (ways, 100, stdin); 
     printf("Ways = %s\n", ways); 
    } 

    return 0; 
} 

Обратите внимание, что это вообще плохая идея, чтобы добавить белый символ пробела в конце строки формата, так как это приводит к scanf() продолжать пытаться читать ввод до тех пор, не белый пробел не встречается , блокируя вход.