Возможно, вам необходимо ввести некоторую проверку ошибок - в частности, вы должны проверить, что вызовы scanf()
действительно преобразовывают значение. Я подозреваю, что разбросанные getchar()
звонки потребляют слишком мало или слишком много, и что одна или несколько ваших scanf()
операций не выполняются, оставляя такие переменные, как n
и / или d
(в le_f()
) неинициализирован, что затем вызывает проблемы в дальнейшем.
Всегда, но всегда, предполагайте, что ввод / вывод (особенно ввод) будет неправильным - на другом конце (например, я или вы) будет идиот, печатающий данные иначе, чем ожидает ваш код.
В целях отладки, по крайней мере, замените вызовы getchar()
своей собственной функцией, которая читает символ и отображает прочитанное (и обнаруживает EOF и выдает ошибку при возникновении ошибки - пока у вас не будет более сложной схемы обработки ошибок) на месте):
#include <ctype.h>
#include <stdio.h>
static void readchar(void)
{
int c;
if ((c = getchar()) == EOF)
{
fprintf(stderr, "Unexpected EOF - exiting\n");
exit(1);
}
printf("Got: %d (0x%02X) %c\n", c, c, isprint(c) ? c : '?');
}
Аналогично, вы должны сделать нечто подобное с scanf()
вызовами:
static void readint(int *var)
{
if (scanf("%d", var) != 1)
{
fprintf(stderr, "Failed to read integer - exiting\n");
exit(1);
}
printf("Got: %d\n", *var);
}
Используйте это вместо ваших scanf()
звонков. Вы можете улучшить диагностику с readint()
, прочитав оставшуюся часть строки в буфер и напечатав следующее:
static void readint(int *var)
{
if (scanf("%d", var) != 1)
{
char buffer[32];
fprintf(stderr, "Failed to read integer - exiting\n");
if (fgets(buffer, sizeof(buffer), stdin) != 0)
fprintf(stderr, "Residual data: <<%s>>\n", buffer);
exit(1);
}
printf("Got: %d\n", *var);
}
Вы можете получить две новые строки из печати «остаточных данных», но это лучше, чем ничего (что может произойти, если остаточная строка длиннее 31 символа. Информации, вероятно, достаточно, чтобы сказать вам, где проблема - не хватает лучше отслеживание ввода.
Использование scanf()
обычно не лучший способ - вы получаете лучший контроль над обработкой ошибок и т. Д., Если вы читаете строки с помощью fgets()
, а затем сканируете ввод с помощью sscanf()
.