Пока scanf! = EOF или scanf == 1? - PullRequest
10 голосов
/ 12 ноября 2010

При прочих равных условиях (правильно сформированные данные, хорошие методы буферизации, а что нет), есть ли причина, по которой я предпочитаю цикл, когда возвращаемое значение scanf равно 1, а не !EOF?Возможно, я где-то читал это или что-то в этом роде, но я тоже могу ошибаться.Что думают другие люди?

Ответы [ 3 ]

14 голосов
/ 12 ноября 2010

scanf возвращает количество элементов, успешно преобразованных ... или EOF при ошибке. Поэтому закодируйте условие так, как оно имеет смысл.

scanfresult = scanf(...);
while (scanfresult != EOF) /* while scanf didn't error */
while (scanfresult == 1) /* while scanf performed 1 assignment */
while (scanfresult > 2) /* while scanf performed 3 or more assignments */

Придуманный пример

scanfresult = scanf("%d", &a);
/* type "forty two" */
if (scanfresult != EOF) /* not scanf error; runs, but `a` hasn't been assigned */;
if (scanfresult != 1) /* `a` hasn't been assigned */;

Редактировать: добавлен еще один более надуманный пример

int a[5], b[5];
printf("Enter up to 5 pairs of numbers\n");
scanfresult = scanf("%d%d%d%d%d%d%d%d%d%d", a+0,b+0,a+1,b+1,a+2,b+2,a+3,b+3,a+4,b+4);
switch (scanfresult) {
case EOF: assert(0 && "this didn't happen"); break;
case 1: case 3: case 5: case 7: case 9:
    printf("I said **pairs of numbers**\n");
    break;
case 0:
    printf("What am I supposed to do with no numbers?\n");
    break;
default:
    pairs = scanfresult / 2;
    dealwithpairs(a, b, pairs);
    break;
}
1 голос
/ 12 ноября 2010

Зависит от того, что вы хотите сделать с искаженным вводом - если ваш шаблон сканирования не совпадает, вы можете получить 0 возвращенное значение.Поэтому, если вы обрабатываете этот случай за пределами цикла (например, если вы рассматриваете его так же, как ошибку ввода), сравните его с 1 (или с любым количеством элементов в вашем вызове scanf).

0 голосов
/ 12 ноября 2010

С http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

В случае успеха функция возвращает количество успешно прочитанных элементов.Это число может соответствовать ожидаемому количеству показаний или меньше, даже нулю, если происходит сбой сопоставления.В случае сбоя ввода до того, как какие-либо данные могут быть успешно прочитаны, возвращается EOF.

Единственный способ убедиться, что вы прочитали количество предназначенных элементов, - это сравнить возвращаемое значение с этимчисло.

...