сброс потока ввода c после каждого целочисленного ввода - PullRequest
2 голосов
/ 26 января 2009

Я должен сделать пользовательские пары ввода числа / процента. код выглядит так:

while(choice != 0)
{
  printf("enter number");
  fgets(line, sizeof(line), stdin);//sizeof(line) is 6
  sscanf(line, "%d\n", choice);
  if(choice > 0)
  {
    printf("enter percentage\n");
    fgets(percent_line, sizeof(percent_line), stdin);//sizeof(percent_line) = 7
    sscanf(percent_line, "%f", &percentage);
    //add to an array holding numbers vs percentages
  }
}

проблема в том, что если я введу строку длиной более 6 (или 5) в строку 5, оставшаяся строка попадет в то, что сканируется в строке 10, и если я введу более длинную строку, которая 7 (или 6) символов в строке 10, оставшийся ввод поступает на ввод в строке 5. Я хочу уничтожить любой оставшийся ввод. как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 26 января 2009

Это не обязательно лучшее решение, но другим подходом может быть использование fscanf():

while(choice != 0)
{
  printf("enter number");
  fscanf(stdin, "%d", &choice);
  if(choice > 0)
  {
    printf("enter percentage\n");
    fscanf(stdin, "%f", &percentage);
    //add to an array holding numbers vs percentages
  }
}

Таким образом, вам не нужны временные буферы line и percent_line. Функция fscanf() будет автоматически продолжать чтение ввода до тех пор, пока не получит то, что ищет - это означает, что если вы просто нажмете Enter при появлении запроса «Ввести номер», функция fscanf() не вернется и продолжит чтение ввода, пока вы не введите число. Кроме того, обработка ошибок не реализована в вышеупомянутом, я оставляю читателю в качестве упражнения исправление проблемы, которая возникает, когда вы вводите что-то, что не число.

(Обратите внимание, что я также изменил choice на &choice, что, я думаю, вы и предполагали в первую очередь.)

0 голосов
/ 09 апреля 2011

Причина, по которой это происходит, заключается в следующем: fgets читает до и только до менее чем значение, указанное во втором параметре. В вашем случае вы просите его прочитать в массив, который может содержать более 6 значений, поэтому он считывает 5 значений в этот массив. Все, что осталось, затем остается в буфере для последующего чтения, которое вы затем читаете в строке 10.

С точки зрения отбрасывания значений, нет никакого реального способа, которым вы можете «очистить» входной буфер или просто очистить его содержимое. Попробуйте следующее, чтобы очистить входной буфер:

while (getc(stdin) != EOF);
clearerr(stdin);

Надеюсь, это поможет.

0 голосов
/ 26 января 2009

я думаю, что последний делает работу довольно хорошо. Я не против, если кто-то введет «acbgrt» вместо числа, я просто хочу, чтобы программа работала правильно. он просто преобразует строковый мусор в 0, а затем выйдет из цикла.

0 голосов
/ 26 января 2009

Вы можете проверить, есть ли \n в line - если нет, используйте fgetc() в цикле, пока не будет найдено \n, затем перейдите к следующему вводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...