Почему это происходит (?) (Печать ... бесконечное количество раз.)
Посмотрите на условия завершения цикла c != EOF
.
int c;
scanf("%d", &c);
for(i = 1; c != EOF; i++) { // Not good code
scanf("%d", &c);
}
EOF
- это некоторое отрицательное значение, часто -1.scanf("%d", &c)
пытается прочитать пользовательский ввод и преобразовать в int
.scanf()
возвращает 1
, 0
, EOF
в зависимости от того, успешно ли 1), 2) не удалось найти числовой текст или 3) произошла ошибка конца файла или ввода.К сожалению, код не использует это возвращаемое значение.Вместо этого код использовал прочитанное число c
и проверил, совпадает ли считанное число с EOF
.
как я могу это исправить?
Цикл только тогда, когда возвращаемое значение scanf()
соответствует ожидаемому (1).
for(i = 1; scanf("%d", &c) == 1; i++) {
...
}
Соединяя это с некоторыми другими идеями
#include <stdio.h>
#include <stdio.h>
int main(void) {
printf("Please enter a stream of numbers to make a set out of them:\n");
int *pSet = NULL; // Start with no allocation
size_t i = 0;
int c;
for (i = 0; scanf("%d", &c) == 1; i++) {
// +--------------------------- No cast needed.
// v v----------v Use sizeof de-referenced pointer
void *p = realloc(pSet, sizeof *pSet * (i + 1));
if (p == NULL) {
free(pSet);
return EXIT_FAILURE;
}
pSet = p;
pSet[i] = c;
}
for (size_t j = 0; j < i; j++) {
printf("%d ", pSet[j]);
}
free(pSet);
return 0;
}