Как передать строку оболочки в программу c EOF? - PullRequest
1 голос
/ 08 марта 2019

Бит C noob и особенно shell noob, так что извините за это. У меня есть задание, где я должен прочитать строку из сценария оболочки и ввести ее в программу c с помощью stdin. Проф дает нам уже написанный скрипт, и строки начинаются с << EOF и заканчиваются EOF. Я понятия не имею, как обработать эту строку в моей программе. Спасибо за помощь. </p>

Программа c:

#include<stdio.h>

int main(int argc, char * argv[]){
  int i = 0, aCount = 0, eCount = 0, iCount = 0, oCount = 0, uCount = 0;
  while(argv[1][i] != EOF){
    if(argv[1][i] == 'A' || argv[1][i] == 'a'){
      aCount++;
    }
    if(argv[1][i] == 'E' || argv[1][i] == 'e'){
      eCount++;
    }
    if(argv[1][i] == 'I' || argv[1][i] == 'i'){
      iCount++;
    }
    if(argv[1][i] == 'O' || argv[1][i] == 'o'){
      oCount++;
    }
    if(argv[1][i] == 'U' || argv[1][i] == 'u'){
      uCount++;
    }
    i++;
  }
  printf("%s%d\n", "Number of A's: ", aCount);
  printf("%s%d\n", "Number of E's: ", eCount);
  printf("%s%d\n", "Number of I's: ", iCount);
  printf("%s%d\n", "Number of O's: ", oCount);
  printf("%s%d\n", "Number of U's: ", uCount);
  return 0;
}

Сценарий:

run () {
  echo "$*"
  if $*
  then echo 'success'
  else echo 'error'
  fi
}

run ./count_vowels <<EOF
Adieu, Bo!
EOF

1 Ответ

5 голосов
/ 08 марта 2019

<<EOF - это запись оболочки, которая означает «Считайте следующие строки из скрипта, пока не увидите EOF, и направьте их в программу в качестве стандартного ввода».

Для программы это будет выглядеть как обычный поток в stdin. Вы можете читать с обычными функциями, включая getchar, scanf и т. Д., До тех пор, пока не будет достигнут конец файла (действительно конец потока), после чего функции укажут, что не могут читать дальше в их различные способы. (В основном, возвращая EOF, но учтите, что scanf может возвращать другие значения, если частичное совпадение происходит в одном вызове до достижения конца потока, например, возврат 0 или 1, чтобы указать 0 или 1 элементы были назначены, хотя 2 были запрошены.)

Это называется здесь документом . Смотрите документацию вашей оболочки для вариантов и украшений. Конкретная строка «EOF» была выбрана по вашей инструкции; можно использовать другие вещи, принятые оболочкой, такие как:

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