Необязательно читать из STDIN в C - PullRequest
2 голосов
/ 18 апреля 2010

Мое приложение в основном представляет собой оболочку, которая ожидает ввода типа cmd [x], где cmd является константой, а x является необязательным.Так что cmd 1 допустимо так же, как cmd само по себе - тогда я предполагаю параметр по умолчанию для x.

Я делаю это:

char cmd[64];
scanf("%s", cmd);
int arg;
scanf("%d", &arg); // but this should be optional

Как я могу прочитатьцелочисленный параметр, и установите его в значение по умолчанию, если ни один в настоящее время не доступен в приглашении?Я не хочу, чтобы приглашение ожидало дополнительного ввода, если оно не было указано в исходной команде.

Я пробовал несколько версий, используя fgetc() и getchar() и сравнивая их с EOF, но безрезультатно,Каждая версия, которую я пробовал, заканчивается ожиданием этого необязательного целочисленного параметра.

Ответы [ 4 ]

3 голосов
/ 18 апреля 2010

Простой способ:

   char b[73]; //powers of 2 magic is evil.
    if(fgets(b,sizeof b,stdin) != NULL) {
      char cmd[59]; //59, no command will ever be > 58. Ever I say.
      int arg;
      if(sscanf(b,"%58s %d",cmd,&arg) == 2) {
         //handle cmd and arg
      } else if(sscanf(b,"%58s",cmd) == 1) {
         //handle cmd only
      } else {
       // :-/
      }
    }
2 голосов
/ 18 апреля 2010

Простой ответ, вы не можете. Среда выполнения C принимает данные от ОС, но не контролирует их. Чтобы сделать что-то подобное, вам нужно будет напрямую взаимодействовать с ОС, используя API для конкретной платформы.

1 голос
/ 18 апреля 2010

Вы читаете построчно? Разве вы не можете просто прочитать всю команду, пока не достигнете "\ n" (перевод строки)? Если перед новой строкой вы получите два токена, это команда и аргумент; если вы читаете только одну, это только команда, а второй аргумент устанавливается по умолчанию.

0 голосов
/ 18 апреля 2010

Вот программа, которая работает (извините, мой предыдущий ответ был сделан на скорую руку).

int main(){
    char cmd[100], line[100];
    int man = 0;
    printf("OK: ");
    fgets(line, 100, stdin);
    int num = sscanf(line,"%s %d",cmd,&man);
    if (num==1)printf("one! %s %d\n", cmd, man);
    else if (num==2)printf("two! %s %d\n", cmd, man);
}

fgets читает строку (с проверкой границ), и sscanf определит, был ли введен один или два токена.

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