#c #scanf
#c #scanf
Вопрос:
Мне нужно что-то сделать, когда пользователь нажимает только enter без какого-либо ввода, но этот пустой. Когда пользовательский ввод является чем-то,
всегда находится сразу за последним символом. Например
ввод: привет, мир
всегда включен, prom[11]
но когда пользователь нажимает только enter
, его там нет.
char prom[100];
scanf("%[^n]", prom);
if (prom[0] == ''){ //if user press enter
//do something
}
Комментарии:
1. Это будет проще, если вы используете
fgets
(или даже лучше,getline
но не все системы предоставляют это) вместоscanf
.2. если
scanf
произошла ошибка сопоставления, то содержимое массива не определено…3. я не могу использовать fgets, потому что fgets заканчивается символом ascii 10, а в моей программе мне нужно отсканировать весь ascii от 0 до 127
4. Ооо, возможно, я не могу его использовать, потому что также находится в ascii как 0 и с fgets он работает. Спасибо
Ответ №1:
НИКОГДА НЕ СКАНИРУЙТЕ СТРОКИ ПРОИЗВОЛЬНОЙ ДЛИНЫ. Это источник дыр в безопасности и общий источник ошибок, которые вам будет очень сложно найти позже. Вы можете использовать scanf для поиска строк, если вы неявно указываете максимальную длину строки для чтения (прочитайте о спецификаторах формата scanf). Но в вашей ситуации быстрее и безопаснее просто использовать fgets. Прочитайте строку. Проверьте, действительно ли вы его прочитали (по возвращаемому значению fgets), а затем проверьте, является ли первый символ (если он действительно существует) ‘n’. Если это так, то пользователь запросил пустую строку.
Кроме того, поскольку у вас есть ваша строка, вы можете безопасно проанализировать ее с помощью sscanf для сообщения, которое вам нужно проанализировать.
Ответ №2:
fgets() является решением для условия, если prom[0] == ‘n’
Ответ №3:
scanf() возвращает количество преобразованных символов. Сравните возвращаемое значение с 0, чтобы увидеть, не было ли выполнено преобразование.
Комментарии:
1. Он возвращает количество успешно подобранных и назначенных спецификаторам символов, а не количество символов. Таким образом, тестирование на ноль — это приемлемый ответ, но тестирование на возврат 1, вероятно, лучше (для более чистой обработки EOF).