Использование scanf для вопроса, позволяет пользователю пропустить вопрос - PullRequest
3 голосов
/ 08 августа 2011

Я работаю над финальным проектом для курса по программированию на Си.Проект заключается в создании базы данных для хранения информации о наркотиках.Я выполнил все элементы, и теперь все сводится к тонкой настройке.

В проекте есть требование, чтобы пользователь мог изменять информацию о наркотиках.В требовании пользователь должен иметь возможность пропустить поле, нажав Enter.Например, пользователь может изменить производителя препарата и количество.Если пользователь не хотел менять производителя, он нажимал ввод и переходил к количеству.

Я просмотрел Интернет и смог позволить пользователю пропустить ввод строки для производителя.,Однако я не могу заставить его работать с целым числом.

Это то, что я использовал, чтобы пользователь мог пропустить ввод строки:

scanf("%30[^\n]", fentry[found].producer);

Для ясности, fentry.producer являетсястрока с 30 символами и найденная является целочисленной переменной.

Я пытался сделать что-то подобное с целочисленным вводом (РЕДАКТИРОВАТЬ: Под целочисленным вводом я имел в виду тот, который вводит количество, а не переменную 'найденный')).Это позволит вам пропустить ввод чего-либо, но если вы введете что-то, оно сохранит случайное значение.

Кто-нибудь знает, как это сделать?

Ответы [ 5 ]

3 голосов
/ 08 августа 2011

Вместо использования scanf() лучший способ получить интерактивный ввод от пользователя - использовать fgets().Эта функция получает полную строку ввода до того места, где пользователь нажимает Enter, и возвращает ее, чтобы вы могли ее проанализировать.

Затем вы можете использовать sscanf() для считывания информации из строки, если хотите,sscanf() работает почти так же, как scanf(), за исключением того, что читает данные из строки, а не из стандартного ввода.

0 голосов
/ 08 августа 2011

Я подозреваю, что буфер клавиатуры вызывает проблемы в вашем коде. При первом вызове кода он будет читать не более 30 символов, если они не являются символом NEWLINE. Они прекратятся, когда они прочитают NEWLINE. NEWLINE останется в буфере.

Однако ... если вы снова вызовете scanf таким же образом, NEWLINE от предыдущего вызова все равно будет в буфере клавиатуры. Это будет прочитано, прежде чем запрашивать больше ввода с клавиатуры. NEWLINE немедленно завершит работу с шаблоном scanf, массив char не будет обновлен, и вы останетесь с указателем char, указывающим на неинициализированную область памяти.

0 голосов
/ 08 августа 2011
scanf("%29s", fentry[found].producer); while('\n'!=getchar());

Это работает вообще, строго соответствует ANSI C, макс.портативный.Входной буфер очищен, длина chararray поддерживается, chararray всегда содержит (завершающий) '\ 0' (инициализация не требуется), а ваш массив никогда не содержит '\ n' из пользовательского ввода.

0 голосов
/ 08 августа 2011

Вы инициализировали целое число до 0 перед scanf?

0 голосов
/ 08 августа 2011

Как насчет этого?

char s[50];
fgets(s, 50, stdin);

if(s[0] != '\n') {
    fentry[found].producer = atoi(s);
}

Вы должны удалить все пробелы из s.

...