Как мне вернуть оператор printf, если пользователь ничего не вводит? - PullRequest
1 голос
/ 11 апреля 2011

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

#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 data\n"); 
      }
   else if (strlen(string_input) > 40) {
      printf("Hex equivalent is       ");
      }
   else {
      printf("Hex equivalent is       ");
      }

}

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

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

НЕ МОЖЕТ ИСПОЛЬЗОВАТЬ FGETS, так как мы не обсуждали это в классе.

Ответы [ 7 ]

1 голос
/ 11 апреля 2011

Используйте

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

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

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

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

   if (chk != 2) {
       printf("ERROR - bad data\n");
   }
1 голос
/ 11 апреля 2011

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

1 голос
/ 11 апреля 2011

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

0 голосов
/ 11 апреля 2011

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

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

0 голосов
/ 11 апреля 2011

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

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

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

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

0 голосов
/ 11 апреля 2011

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

0 голосов
/ 11 апреля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...