2015-07-02 2 views
-4

Почему не получает вход? Код компилируется, но gets пропускается. Пожалуйста, помогите мне. Я новичок в c.Получает работу в Main, но не в какой-либо другой функции

Когда я использую функцию gets в основном, она отлично работает.

Но когда я использую его в add(), он не работает. В чем причина этого.

void add() 
{ 
    int a,y,found; 
    printf("enter roll number"); 
    scanf("%d",&a); 
    y=0; 
    while(y<=numberOfRecords) 
    { 
     if(a==s[numberOfRecords].rollNumber) 
     { 
      found=1; 
      break; 
     } 
     else 
     { 
      found=0; 
     } 
     y++; 
    } 

    if(found==1) 
    { 
     printf("this roll number have been assigned to %c",s[numberOfRecords].name); 
    } 
    else 
    { 
     s[numberOfRecords].rollNumber=a; 
     printf("enter name of student\n"); 
     gets(s[numberOfRecords].name); 
     printf("student added\n"); 
     numberOfRecords++; 
    } 

} 
+2

Не используйте 'получает()', 'используйте fgets()' вместо этого. –

+1

Что вы имеете в виду, когда говорите «это не работает»? Что именно он делает, чего вы не ожидаете? – dbush

+0

Всякий раз, когда 'found == 1' ваш код никогда не достигнет вызова' gets() '. –

ответ

1

Первые вещи сначала - НИКОГДА НИКОГДА НИКОГДА НИКОГДА не использования gets. Он будет ввести точку отказа в вашу программу. Он устарел на C99 и был удален из версии языка C2011. Вместо этого используйте fgets.

Что касается актуальной проблемы, это связано с смешиванием scanf и gets по тому же коду. Когда вы вводите номер рулона, например 5, ваш входной поток содержит последовательность символов {'5', '\n'}. Функция scanf потребляет 5, но оставляет символ новой строки во входном потоке.

Затем, когда вы вводите имя, подобное "joe", входной поток содержит последовательность символов {'\n', 'j', 'o', 'e', '\n'}. Когда gets читает поток, самый первый символ, который он видит, - это символ новой строки, оставшийся от количества входных данных рулонов, заставляя его немедленно возвращаться и больше не читать текст.

Существует два пути решения этой проблемы. Вы можете добавить getchar вызов после scanf вызова (уродливый), или использовать scanf с %s спецификатором преобразования вместо gets вызова, который будет пропускать через любой ведущие пробелы:

printf("enter name of student\n"); 
scanf("%s", s[numberOfRecords].name); 

Однако, чтобы быть безопасным, вы должны использовать явный размер в спецификаторе преобразования %s, чтобы предотвратить scanf от чтения большего количества символов, чем размер name. Таким образом, если name может содержать 80 символов, используйте

scanf("%79s", s[numberOfRecords].name); // leave 1 for the 0 terminator 
+0

Ваше описание того, что происходит, не совсем корректно. _ «Тогда, когда вы вводите имя типа« joe »_, не происходит. Буфер ввода по-прежнему содержит' \ n' из предыдущего ввода, который будет потребляться 'gets', не предоставляя пользователю возможность введите что-нибудь. –