Проверьте, пуст ли пользовательский ввод в C с помощью scanf

#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).