Вы должны всегда проверить возвращаемое значение scanf
.
Причина в том, что возвращаемое значение - это то, что scanf
использует для передачи ошибок преобразования, среди других ошибок. Например, если ваша программа сообщает scanf
, чтобы ожидать последовательность десятичных цифр, а scanf
встречает что-то, что не соответствует этому шаблону, возвращаемое значение укажет на этот сбой.
Возвращаемое значение будет состоять из числа элементов, которые были успешно присвоены. Например,
char str[128];
int x, y = scanf("%d %127s", &x, str);
Если y
является 1, то следует считать, что x
безопасно использовать. Если y
равно 2, то следует предположить, что как x
, так и str
являются безопасными в использовании.
Это часть ответа на ваш вопрос. Следующая часть - это то, как вы можете следить за тем, чтобы входной сигнал находился в форме строк. scanf
строго не относится к линиям; он относится к другим единицам, таким как %d
, являющийся int
, закодированным как последовательность десятичных цифр (и знак); он вернется, как только последовательность десятичных цифр закончится ... Нет никакой гарантии, что десятичные цифры будут занимать всей строки.
Здесь есть две проблемы: ведущие и конечные пробелы. Все спецификаторы формата, за исключением [
, c
, C
и n
, приведут к отбрасыванию ведущих пробелов. Если вы хотите обрабатывать ведущие пробелы по-разному, вам нужно будет кодифицировать, как вы ожидаете, что будет обрабатываться ведущее значение whitespace.
Учитывайте, что отбрасывание ввода пользователем почти всегда (если не всегда) является плохим. Если вам все равно, что содержит оставшаяся часть строки, вы можете использовать что-то вроде scanf("%*[^\n]"); getchar();
, чтобы отбросить все, что тянется до символа новой строки '\n'
... Первое утверждение попытается прочитать как можно больше символов без символов новой строки , а второй будет отбрасывать завершающий символ новой строки.Однако, если вы хотите убедиться, что вход занимает всю строку, тогда вам нужно проверить значение, возвращаемое getchar
.
Пример использования всех этих соображений:
/* Test for leading whitespace (including newlines) */
int c = getchar();
if (c != '-' && !isdigit(c)) {
/* Leading whitespace found */
}
ungetc(c);
/* Test for correct data conversion */
int x, y = scanf("%d", &x);
if (y != 1) {
/* Something non-numeric was entered */
}
/* Test for trailing newline */
c = getchar();
if (c != '\n') {
/* Trailing newline found */
}
Вооруженный этой информацией, возможно, вы можете придумать попытку и обновить свой вопрос с какой-то код, если у вас есть какие-то проблемы ...
PS Я заметил в коде, который вы написали, у вас, кажется, есть %f
и %d
confused; %f
для чтения в float
с, и %d
для чтения в int
с, а не наоборот ...
вы должны сделать это с 'scanf'? –
показать свои усилия – snr
Прочитайте строки с 'fgets'. Преобразование с помощью 'sscanf' или' strto_' семейства функций. – user3386109