C 为什么不是';是否将重定向的输入视为命令行参数?
我正在尝试读取已从文件重定向的命令行参数。我使用的命令是./a.outC 为什么不是';是否将重定向的输入视为命令行参数?,c,C,我正在尝试读取已从文件重定向的命令行参数。我使用的命令是./a.out
int main(int argc, char* argv[], char* envp[]) {
for (int i = 1; i < argc; i++) {
printf("%s\n", argv[i]);
}
}
intmain(intargc,char*argv[],char*envp[]{
对于(int i=1;i
在为程序准备命令行之前,shell会拦截重定向命令:
myProg <infile -t >outfile
在pogram启动之前,
stdin
和stdout
已重新路由。因此,程序永远看不到重定义。因为语言就是这样定义的。假设你说的是真的-
所有用户输入必须来自命令行参数,但从文件重定向的文本可以满足不同功能中所需的输入。如果输入显示为命令行参数,则可以实现这一点
考虑一下这个计划:
#include <stdio.h>
int is_dict(char *word)
{
/* code to look up a dictionary */
int result = 1;
return result;
}
int main(int argc, char *argv[])
{
if(argc == 2 && is_dict(argv[1]))
printf("%s found", argv[1]);
return 0;
}
#包括
int是单词(char*word)
{
/*查找字典的代码*/
int结果=1;
返回结果;
}
int main(int argc,char*argv[])
{
如果(argc==2&&is_dict(argv[1]))
printf(“%s已找到”,argv[1]);
返回0;
}
如果程序以这种方式编写以适应它,那么输入必须来自命令行参数。当输入未重定向时,您将如何接受输入?它需要更多的程序开销来检测丢失的输入
此外,想象一个包含一百万个单词的文本文件:期望每个单词都以argv[n]
的形式出现是不可能的
还有其他反对意见。假设程序打印一系列响应提示。用户必须事先知道提示是什么,以便在提示出现之前提供答案
最后,如果程序是从GUI运行的,那么在运行之前,所有程序的输入都必须编辑为其属性。除了简单的派生之外,还有很多情况:
dir > myfile.txt
特别是,您可以通过管道将输出从一个程序传输到另一个程序:
dir | more
如果
dir
命令发送到more
命令,它将发送输出。由于程序启动由OS shell处理,它也会处理重定向。重定向将您写入的输出重定向到stdout
,或从stdin
读取的输入。此外,您的printf
是错误的。格式“%i”
用于整数,argv[i]
是以null结尾的字符串。格式说明符和参数不匹配会导致未定义的行为。最后,您的代码甚至不应该构建!更不用说跑步了。如果您没有使用envp
,则不必指定该参数。我的问题是,为什么test.txt的内容不作为命令行参数处理?如果我运行./a.out Hello world,我的程序将打印所有3个参数。但是,如果运行./a.outargc
为1时,没有命令行参数。在这种情况下,可以通过stdin
或者通过scanf()
dir | more