gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:37:51 27 4
gpt4 key购买 nike

虽然有一种使用文件重定向管道以及交互式用户输入读取的简单方法,但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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com