Передача ввода в getchar () приглашает c - PullRequest
0 голосов
/ 20 сентября 2018

Предполагая, что у меня есть программа на C, которая имеет следующую структуру и которая выполняет что-то вроде этого:

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

   int afunction(char *arg) {
     if (strcmp(arg, "something") == 0) {
        return 1;
     } else {
       return 0;
     }
   }

   int main(int argc, char *argv[]) {
        char ans = 'n';
   if (afunction(argv[1])) {
        printf("The value of your entered parameter was \"something\" \n");
   } else {
        printf("The value of your entered parameter was not \"something\" \n");
        printf("Do you wish to try again? (y/N) ");
        ans = getchar();
        if (ans == 'y') printf("Your answer was y");
        // If this program wasn't a mock up, relevant code to restart would be added.
   }
        return 0;
}

Это работает, если я запускаю ее вручную:

foo@test:~$./myprogram goo
The value of your entered parameter was not "something"
Do you wish to try again? (y/N) y
Your answer was y
foo@test:~$

ОднакоЯ не могу заставить его напечатать «Ваш ответ был y», если я передам ввод.Т.е. для всего следующего:

foo@test:~$echo 'y' | ./myprogram requiredparameter
foo@test:~$echo 'y/n' | ./myprogram requiredparameter
foo@test:~$yes | ./myprogram requiredparameter
foo@test:~$printf 'y/n' | ./myprogram requiredparameter
foo@test:~$printf 'y' | ./myprogram requiredparameter
foo@test:~$./myprogram requiredparameter <<< echo 'y'
foo@test:~$./myprogram requiredparameter <<< echo 'y/n'
foo@test:~$./myprogram requiredparameter <<< printf 'y'
foo@test:~$./myprogram requiredparameter <<< printf 'y/n'

Мой результат:

The value of your entered parameter was not "something"
Do you wish to try again? (y/N) foo@test:~$

Из этого следует, что я неправильно передал ввод, и, следовательно, программа завершает работу автоматически, так как используетзначение по умолчанию ans, которое 'n'.Почему эти методы не работают?Как я могу направить ввод в приглашение?

РЕДАКТИРОВАТЬ: Для ясности.

РЕДАКТИРОВАТЬ2: requiredparameter делает вещи, которые не имеют отношения к вопросу, но требуется для исполняемого файла вбежать (я думаю, что это вызвало ненужную путаницу).Кроме того, ans = 'n' по умолчанию, который я должен был указать.

EDIT3 / 4: Сделал макетную программу немного более правдоподобной, учитывая входные данные и требуемые параметры.

1 Ответ

0 голосов
/ 21 сентября 2018

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

Хотя многие из ваших тестов неверны.

./myprogram requiredparameter <<< echo 'y' 

не запускает echo y и отправляет его на стандартный ввод.Это так же, как если бы вы запустили

 echo ' ' |./myprogram requiredparameter echo 'y'

Так что ваша программа просто читает пробел.Если вы хотите сделать это с помощью оператора <<< оболочки, это будет

./myprogram requiredparameter <<<$(echo 'y')

или просто

./myprogram requiredparameter <<<y

Обратите внимание, что после << не должно быть пробела.<там.</p>

Я бы посоветовал вам также попытаться отладить ваш код, чтобы вы могли видеть, что происходит, или добавить некоторую трассировку отладки, такую ​​как:

ans = getchar();
printf("getchar() read character value %d\n", ans); // debug
if (ans == 'y') printf("Your answer was y");

Затем вы можете посмотреть ascii значение, которое вернул getchar.

Также запишите новую строку в ваших выражениях printf, поэтому измените

printf("Your answer was y");

на

printf("Your answer was y\n");

Таким образомвы можете видеть вывод сразу же, когда вы запускаете программу в терминале, иначе вывод из printf буферизуется и не отображается, пока вы не напечатаете новую строку или не вызовете fflush(stdout), или программа не завершится нормально.

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