Scanf не заканчивается - PullRequest
       11

Scanf не заканчивается

0 голосов
/ 07 сентября 2010

Итак, я получил следующий код (C):

char c = getc(in);
if (c == '(')
   ...
if (c == '%')
   ...
if (isdigit(c))
{
   int n;
   ungetc(c, in);
   scanf("%i", &n);
   ...
}

Все нормально и прекрасно, когда я читаю данные ввода из stdin, но при чтении ввода данных из файла вызов scanf не прекращается.

Я добавил код вокруг звонка, чтобы посмотреть, что происходит до звонка на scanf. Одним из таких примеров является

  1. c = '0'
  2. символ сразу после c равен )

Не очищается ли буфер после ungetc или что-то еще? Что может случиться, что он работает нормально, когда ввод stdin, но не когда это файл? (Я не очень знаком с IO в C).

править: Надо было использовать fscanf ... у мальчика красное лицо.

Ответы [ 3 ]

1 голос
/ 07 сентября 2010
  1. getc() вернет EOF, когда вы достигнете конца или возникнет ошибка, поэтому обязательно проверьте это.Ваш c должен быть целым числом, а не символом, чтобы иметь возможность различать EOF.

  2. То же самое относится и к scanf, проверяя его возвращаемое значение для EOF.Для scanf преобразование также может завершиться неудачно, scanf("%i", &n) должно вернуть 1, если оно успешно проанализировало что-то в n, поэтому убедитесь, что вы также проверили это.1.

  3. Вы также работаетена in, как на getc(in), предполагая, что вы читаете из определенного ФАЙЛА *, однако ваш вызов scanf все еще читает со стандартного ввода.

    Используйте fscanf вместо scanfтам.

0 голосов
/ 25 января 2014

в моем случае где-то ниже оператора scanf был бесконечный цикл, удалите бесконечный цикл:

unsigned long x,y; 
scanf("%llu%llu",&x,&y);
while(i<=4) {   
if(list[i]>=x && list[i]<=y)        
count++;        
//i++;      
}
0 голосов
/ 07 сентября 2010

scanf() будет принимать данные из файлового дескриптора stdin. Если перенаправить, то возьму из соответствующего источника. getc() будет читать из любого дескриптора файла. Вы смешиваете входные данные из файла и стандартного ввода.

Возможно, вас больше заинтересует fscanf() для чтения из вашего файла.

char c = getc(in);
if (c == '(')
   ...
if (c == '%')
   ...
if (isdigit(c))
{
   int n;
   ungetc(c, in);
   fscanf(in, "%i", &n);
   ...
}
...