【问题标题】:How to pass integers values to a C program executable file through shell script?如何通过 shell 脚本将整数值传递给 C 程序可执行文件?
【发布时间】:2021-09-06 14:52:28
【问题描述】:

我想编写一个简单的 shell 脚本来为 C 程序自动运行 5 个测试用例,该 C 程序按升序打印输入的 3 个整数。

我的 shell 脚本如下所示:

./a.out << 15 25 97
./a.out < 73 36 12
./a.out < 43 15 99
./a.out < 100 100 100
./a.out < 37 150 37

显然,这是错误的,因为我一直在玩弄语法并尝试不同的方法来查看哪些方法有效,但我希望很清楚我在这里尝试做什么——只需使用 3 个不同的整数输入运行程序时间。

我尝试并使用的一种方法是将每个测试用例放在一个文本文件中,但如果我想每次都更改输入,这样做似乎有点麻烦。正在寻找更简单简洁的解决方案。

C程序的输入读sn-p为:

int main() {
  int m, n, p;
  //Read m, n, p
  printf("Give values of m, n and p = ");
  scanf("%d%d%d",&m,&n, &p);

然后使用 m、n 和 p 的值进行计算。

【问题讨论】:

  • 试试./a.out 545
  • 请提供您的 C 程序的minimal reproducible example,以便我们了解它所期望的获取信息的方法。
  • 附带说明:系统地选择您的测试用例,而不是随意地选择测试用例,并且容易分辨是非。测试15 25 97 是否提供1 2 3 没有的任何信息?您的代码是否取决于数字的大小?
  • 另一个注意事项:C 和 C++ 是非常不同的语言。请不要同时标记两者,除非您特别询问它们的区别。
  • @imtryin123 :您只能将字符串作为参数传递给新进程,但 C 有一个标准函数 atoi,您可以在其中将字符串转换为整数。但是,您忘记向 main 函数声明参数。这是讨论here

标签: c linux shell testing


【解决方案1】:

&lt;&gt; 进行文件之间的重定向,而不是字符串。

| 在进程之间创建管道,echo 输出到标准输出。

你想要的模式

echo 1 2 3 | program

【讨论】:

    【解决方案2】:

    如果你想用scanf读取数字,你可以使用Bash here-strings:

    #!/bin/bash
    ./a.out <<< "15 25 97"
    ./a.out <<< "73 36 12"
    

    你也可以改变你的程序来读取参数:

    int main(int argc, char** argv) {
      int m, n, p;
      if (argc<4) {
        printf("Not enough numbers\n");
        return 1;
      }
      m=atoi(argv[1]);
      n=atoi(argv[2]);
      p=atoi(argv[3]);
    }
    

    然后运行./a.out 15 25 97

    【讨论】:

      【解决方案3】:

      输入的整数

      这些适用于大多数 shell,称为程序,而不是整数(但)。你错过了特殊的&lt;&lt;&lt; 运算符:

      $ cat <<<"1 2 3"
      1 2 3
      

      或点赞评论:echo 1 2 3 | cat

      这是像文件内容一样读取标准输入。 (从cat 的角度来看)。一个更有用的例子:

      $ bc <<<"1+2"
      3
      

      cat 1 2 3No such file 三次。但是您的 a.out 可能需要 3 个或更多空格分隔的“单词”,这些“单词”可以转换为 C 整数。就像 cat 期望那里的文件名转换成它们的内容一样。

      这是传递命令行参数。程序读取由 shell 填充的字符串数组。


      参照。 cpio -o 归档命令。唯一的非可选参数(除了 -o create 或 -i extract 或 -p 之一)是:

      cpio -o < name-list
      

      首先这似乎不切实际。没有文件名作为参数,只有强制文件。但想法是:

      find ... | cpio -o >bu.cpio
      

      优于:

      cpio -o $(find ...) >bu.cpio
      

      或者:|xargs 简单。

      比较。 tar 用于其他方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 2014-10-04
        • 2023-04-03
        • 1970-01-01
        • 2015-12-20
        • 2018-06-11
        • 1970-01-01
        相关资源
        最近更新 更多