Как мне вернуть инструкцию printf, если пользователь ничего не вводит?

#c

#c

Вопрос:

Я хочу выполнить инструкцию, основанную на вводе пользователя:

 #include <stdio.h>
#include <string.h>

void main() {

   char string_input[40];
   int i;

   printf("Enter data ==>  ");
      scanf("%s", string_input);

   if (string_input[0] == 'n') {
      printf("ERROR - no datan"); 
      }
   else if (strlen(string_input) > 40) {
      printf("Hex equivalent is       ");
      }
   else {
      printf("Hex equivalent is       ");
      }

}
  

Когда я запускаю ее и просто нажимаю enter, она переходит на новую строку вместо сообщения «ОШИБКА — нет данных».

Что мне делать?

НЕ УДАЕТСЯ ИСПОЛЬЗОВАТЬ FGETS, поскольку мы не рассматривали это в классе.

Комментарии:

1. И что бы вы хотели, чтобы это делало вместо этого? Нет ввода — ответвляется на «нет ввода».

2. Обязательно ли ‘magic quit’ быть пустой строкой?

3. Да, это так. Должно работать для пробела и ввода.

4. вводящий в заблуждение ответ (заголовок).. это должно выглядеть следующим образом — как получить пользовательский ввод без fgets()…

Ответ №1:

Использовать

 char enter[1];
int chk = scanf("9[^n]%c", string_input, enter);
  

но string_input внутри не будет 'n' . Ваш тест

    if (string_input[0] == 'n') {
       printf("ERROR - no datan");
   }
  

нужно будет изменить на, например

    if (chk != 2) {
       printf("ERROR - bad datan");
   }
  

Ответ №2:

используйте fgets вместо scanf . scanf не проверяет, вводит ли пользователь строку длиной более 40 символов в вашем примере выше, поэтому для вашего конкретного случая fgets должно быть проще (безопаснее).

Комментарии:

1. Мы не переходили к fgets в классе, поэтому я не могу его использовать. Мой друг упомянул использование gets , но я не знаю почему.

Ответ №3:

Можете ли вы использовать цикл while и getch, а затем проверять <Enter> ключ при каждом нажатии клавиши?

Ответ №4:

scanf не вернется, пока не увидит что-то отличное от пробела. Он также не различает новые строки и другие пробелы. На практике использование scanf почти всегда является ошибкой; Я предлагаю вам вызвать fgets вместо этого, а затем (если вам нужно) использовать sscanf для результирующих данных.

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

Вам действительно следует быть таким же осторожным при вызове scanf или sscanf — что, если пользователь вводит строку длиной в 100 символов? (Вы можете указать scanf или sscanf принимать только строку ограниченной длины.)

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

Комментарии:

1. Спасибо за объяснение, но я не могу использовать fgets, поскольку мы не использовали это в классе.

Ответ №5:

fgets делает то, что вам нужно. Избегайте использования scanf or gets . Если вы не можете использовать fgets попробуйте использовать getchar

Комментарии:

1. В вашем исходном сообщении говорилось «не домашнее задание». (f) scanf будет продолжать чтение, пока не найдет строку, поэтому я не верю, что есть какой-либо способ проверить, сколько пустых строк ввел пользователь. Если вы действительно не можете использовать fgets, вернитесь к getchar()

Ответ №6:

Проблема в том, что "%s" предпринимаются попытки пропустить пробелы, а затем прочитать строку — и, согласно scanf , новая строка является «пробелом».

Очевидной альтернативой было бы использовать "%c" вместо "%s" . Разница между ними заключается в том, что "%c" они не пытаются пропустить начальный пробел.

Несколько менее очевидной (или менее известной, во всяком случае) альтернативой было бы использовать "%[^n]%*[n]" . Это считывает данные до тех пор, пока не встретит новую строку, затем считывает новую строку и ничему ее не присваивает.

Независимо от того, какое преобразование вы используете, вы хотите (действительно нуждаетесь) ограничить объем вводимого ввода, чтобы он не переполнял предоставленный вами буфер, поэтому вы хотели бы использовать "9c" или "9[^n]" . Обратите внимание, что когда вы указываете длину для scanf , вам нужно вычесть единицу, чтобы оставить место для нулевого ограничителя (в отличие от fgets , для которого вы указываете полный размер буфера).

Ответ №7:

На какой платформе вы работаете?

Действительно ли символ отправляется при нажатии клавиши ENTER 'n' , или это может быть 'r' ? Или даже оба варианта один за другим (т. е. "rn" ).