2013-12-17 2 views
0

В моей программе C fgets не читает никаких данных. Пожалуйста, смотрите ниже код:Странное поведение кода C (функция fgets)

#include <stdio.h> 
int main() 
{ 
     char string[50]; 
     int marks,i,n, limit; 
     printf("Enter Limit : \n"); 
     scanf("%d", &limit); 
     FILE *fptr; fptr=(fopen("string.txt","w")); 
     if(fptr==NULL){ 
       printf("Error!"); 
       return 0; 
     } 
     printf("Enter a string : \n"); 
     fgets(string, sizeof(string), stdin); 
     fwrite(string, 1, sizeof(string), fptr); 
     fclose(fptr); 
     return 0; 
} 

После того как я ввод предела, программа показывает «Введите строку» и просто завершает работу (до ввода каких-либо данных). Если я удалю оператор scanf("%d", &limit);, он отлично работает. Также, если добавить getchar(); заявление выше fgets, он будет работать нормально. Кто-нибудь знает причину этой проблемы?

ответ

4

Это из-за вашего использования scanf ранее в коде. Когда вы вводите номер в качестве ввода, вы нажимаете клавишу . Введите, чтобы отметить конец ввода и который добавляет новую строку во входной буфер. То, что scanf делает, считывает номер, но оставьте новую строку (введите ключ) во входной буфер. Затем, когда вы вызываете fgets, он видит эту одинокую новую строку и читает ее.

Очень простое решение это сказать scanf пропускать конечные пробелы, добавив один пробел после кода формата:

scanf("%d ", &limit); 
/*  ^  */ 
/*  |   */ 
/* Note space here */ 

Если вышеуказанное решение не работает, то вы можете читать символы, пока вы не получите строку:

int c; 
while ((c = fgetc(stdin)) != EOF && c != '\n') 
    ; 

Кроме того, в Mac OSX есть функция fpurge, которая может быть использована для очистки непрочитанных данных от inpu т поток:

fpurge(stdin); 

Примечание:fpurge функция не портативный.

В Linux и Windows вы можете использовать fflush для выполнения той же самой функции fpurge, но обратите внимание, что это расширения в библиотеках для Linux и Windows, которые это позволяют. Вызов fflush на входном потоке, согласно спецификации C, не определен. См. the Linux manual page или Windows reference page.

+0

Я изменил код следующим образом. scanf ("% d", & limit); Но теперь вывод выглядит следующим образом: 1. Введите предел 2. 3 (Комментарий: введенный предел и нажмите Enter ket) 3. sswew (Комментарий: мне пришлось снова ввести что-то здесь и снова нажать Enter) 4. Введите строку (Комментарий : Прежде чем вводить какие-либо программные выходы) – Vaquita

+1

Я не знаю, почему это не работает для меня. Когда вы даете дополнительное пространство после '% d', я должен нажать дополнительный символ, и это заставляет программу заканчиваться. – haccks

+0

Joachim Не могли бы вы проверить это? Я использую Mac OS X 10.8 и CC Compiler. Выше решение не работает для меня. – Vaquita

0

Если вы используете sscanf и введите номер, вы нажмете «Enter» ... номер обрабатывается sscanf, но «Enter» обрабатывается fgets

0

Это потому, что fgets читает символ новой строки \n, оставшийся позади предыдущего scanf. Один из возможных способов съесть это \n добавить getchar после scanf.

getchar(); 
    printf("Enter a string : \n"); 
    fgets(string, sizeof(string), stdin); 
Смежные вопросы