虽然有一种简单的方法可以使用文件重定向和管道,以及交互式用户输入读取,使用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()本身,因此可能没有一种简单的方法可以做到这一点.
我看到使用stdin或文件输入或管道输入非常明显.但是,阅读命令行参数是一个不同的故事.这是一个演示我通常如何编码的演示,但它看起来有点笨拙并且被黑客入侵.此外,在更复杂的选项场景中,这可能会成为一个相当混乱的代码.我也不确定这是多么安全或傻瓜证明……
#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是一个很好的起点.
现在,对您来说是一个挑战:将这三个操作包装在库中并使其成为开源的,这样我们其他人就可以受益! 🙂