如何使用EOF将Shell字符串传递给C程序?

时间:2019-03-07 22:28:44

标签: c linux shell

有点C的菜鸟,尤其是外壳菜鸟,请原谅。我有一个作业,我必须从shell脚本中读取一个字符串,然后使用stdin将其输入到c程序中。教授给了我们一个已经写好的脚本,字符串以<< EOF开头,以EOF结尾。我不知道如何在程序中处理此字符串。感谢您的帮助。

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 个答案:

答案 0 :(得分:5)

<<EOF是一种shell表示法,表示“从脚本中读取以下行,直到看到EOF,并将它们作为标准输入传递到程序中。”

对于程序,这将在stdin中显示为常规流。您可以使用包括getcharscanf等在内的常用函数进行阅读,直到到达文件末尾(实际上是流末尾)为止,此时函数将指示它们无法以各种方式进一步阅读。 (大体上返回EOF,但是请注意,如果scanf可能返回其他值,如果在到达流末尾之前在一个调用中发生了部分匹配,例如返回0或1表示0或1个项目被分配,尽管请求了2个。)

这称为here document。有关变化和修饰,请参见您的shell文档。根据您的指令选择了特定的字符串“ EOF”;一个人可以使用外壳程序接受的其他东西,例如:

ProgramName Arguments <<EndOfMyInput
MyLine1
MyLine2
MyLine3
EndOfMyInput