c - unix:C 中的 main() 交互、命令行、管道和重定向?

标签 c unix command-line

虽然有一种使用文件重定向管道以及交互式用户输入读取的简单方法,但main(),如该 C 代码片段所示...

#define  SIZ 1024
#include <stdio.h>
extern void do_something_with_the_array(float *a[], int *n);

int main(int argc, const char * argv[])
{
    float f[SIZ];
    int k = 0;
    while ((scanf("%f", &f[k]) == 1)&&(k < SIZ)) {
      k++;
    }
    do_something_with_the_array(f, k);
    return 0;
}

…我不确定是否有现代 UNIX 源兼容且简单的方法以编程方式在 C 中的 main() 中实现三种可能性中的任何一种,取决于上下文?

  • 交互式读取一串数字作为用户输入
  • 读取与命令行参数相同的数字字符串
  • 文件重定向和管道

我理解管道和重定向“属于”shell,它在程序开始执行之前拦截程序,而命令行参数和交互式读取“属于”main()/strong> 本身,因此可能没有一种简单的方法可以做到这一点。

我看到使用 stdinfile 输入或 pipe 输入非常不言自明。然而,阅读命令行参数是另一回事。这是一个我通常如何编码的演示,但它对我来说看起来有点笨拙和被黑了。此外,在带有选项的更复杂的场景中,这可能会变成一段相当困惑的代码。我也不确定这是多么安全或万无一失......

#define  SIZ 1024
#include <stdio.h>
#include <stdlib.h>
extern void do_something_with_the_array(float *, int);

int main(int argc, const char * argv[])
{
    float f[SIZ];
    int k = 0;
    if(argc > 2){
        for(k = 0; k < argc - 1; k++) 
            f[k] = (float)atof(argv[k+1]);
    }
    else while ((scanf("%f", &f[k]) == 1)&&(k < SIZ))
        k++;

    do_something_with_the_array(f, k);
    return 0;
}

提前致谢!

最佳答案

我不知道 C 库的副手会使您提到的三个特定案例看起来相同(尽管有人知道,请回答,因为我也想知道!)。我认为您正在寻找与 the diamond <> operator in Perl 相似的东西,但针对单个参数而不是包含参数的文件。

我认为@David Hoelzer 的想法是正确的:分别处理这三种情况。例如,在处理命令行或文件参数时,不要生成您可能会为交互式输入打印的“输入值”提示。对于命令行处理,getopt是一个很好的起点。

现在,您面临一个挑战:将这三个操作封装在一个库中并使其开源,以便我们其他人都能受益! :)

关于c - unix:C 中的 main() 交互、命令行、管道和重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36723271/

相关文章:

导入库可以同时包含 stub 和静态代码吗?

我可以将处理器缓存内容显式转储到文件吗?

c - 读取/处理程序

unix - 编码帮助 (KeyBasic)

java - 从命令行删除java文件中的特定函数而不进行编辑

bash - 使用 GIMP 的命令行转换 XCF 和其他文件?

c - 基于不透明结构的 C API 的单元测试

c - 获取存储文件的文件系统类型

c - 一次接受多客户端请求

c# - 如何从命令行构建 .csproj 并将日志写入指定位置?