Ceteris paribus (хорошо сформированные данные, хорошие методы буферизации и что нет), есть ли причина, по которой я предпочитаю цикл, а возврат scanf
равен 1, а не !EOF
? Я, возможно, читал это где-то, или что-то еще, но я могу ошибаться. Что думают другие люди?
Пока scanf!= EOF или scanf == 1?
Ответ 1
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;
}
Ответ 2
Зависит от того, что вы хотите сделать с неправильным вводом - если шаблон сканирования не сопоставлен, вы можете получить 0
. Поэтому, если вы обрабатываете этот случай вне цикла (например, если вы относитесь к нему так же, как и входная ошибка), сравните его с 1
(или, как многие другие элементы в вашем вызове scanf).
Ответ 3
Из http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
При успешном выполнении функция возвращает количество элементов успешно прочитано. Эта count может соответствовать ожидаемому числу показаний или меньше, даже ноль, если происходит сбой соответствия. В случае входного отказа перед любыми данными может быть успешно прочитано, EOF вернулся.
Единственный способ убедиться, что вы прочитали количество объектов, предназначенных для сравнения возвращаемого значения с этим номером.