【发布时间】:2016-08-11 22:04:50
【问题描述】:
虽然使用 文件重定向 和 管道 以及交互式用户输入读取有一种简单的方法,但 main(),如这段C代码sn-p...
#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() 中的三种可能性中的任何一种,具体取决于上下文? p>
- 交互式读取一串数字作为用户输入
- 读取与命令行参数相同的数字字符串
- 文件重定向和管道
我理解管道和重定向“属于”shell,它在程序开始执行之前拦截程序,而命令行参数和交互式读取“属于”main() 本身,因此可能没有简单的方法来做到这一点。
我看到使用 stdin 或 file 输入或 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;
}
提前致谢!
【问题讨论】:
-
您发布的片段可能会溢出。
-
为什么这些事情不可能?只需编写 switch 语句来处理这三个条件。
-
程序通常不知道
stdin是指终端控制台、文件、套接字还是您能想到的任何其他流。 -
请问有人能解释一下问这个问题有什么问题吗?
-
@user3078414:代码的sn-p只使用
stdin。它没有说明您还期望做什么,问题的其余部分也没有说明。
标签: c unix command-line