Почему это допустимый оператор scanf, который может выйти из строя через некоторое время l oop? - PullRequest
1 голос
/ 30 апреля 2020

Почему это допустимая строка кода, которая выходит из бесконечного while l oop?

if (scanf("%s", word) != 1) break;

Ответы [ 2 ]

1 голос
/ 30 апреля 2020
if (scanf("%s", word) != 1) break;

scanf возвращает количество успешно использованных предметов. Это значение используется в качестве левого операнда внутри выражения. Таким образом, это выражение совершенно верно.

В следующем примере это значение должно быть 1, если не произошла ошибка ввода-вывода и строка была успешно преобразована, потому что есть только один элемент для потребления.

Полагаю, этот оператор if является частью al oop, целью которого является чтение последующих слов из ввода, пока он не встретит состояние EOF для stdin или любой перенаправленный файл, используемый в качестве ввода, поскольку только тогда условие оценивается как true (и с этим для выхода из окружения l oop), если EOF или другая ошибка I/O произошла, поскольку scanf() возвращает 0 в этом случае.

Это даст вам представление о том, как это if утверждение должно быть оценено и интерпретировано.

0 голосов
/ 30 апреля 2020

Упомянутое заявление об остановке и его защита действительны, но они лгут. Рассмотрим l oop

while (1) {
   ...
}

В соответствии с правилами структурированного программирования l oop никогда не должен выходить, то есть, если программа не завершается. Вместо использования оператора break правильно структурированная программа должна использовать возвращаемое значение из функции scan в качестве защиты l oop, например:

tokenCount = scanf("%s", word);
while (tokenCount == 1) {
    ...
    tokenCount = scanf("%s", word);
}

Это также проще причина правильности программы, если выражения не имеют побочных эффектов; поэтому возвращаемое значение хранится в переменной (со значимым именем).

...