C 为什么不是';是否将重定向的输入视为命令行参数?

C 为什么不是';是否将重定向的输入视为命令行参数?,c,C,我正在尝试读取已从文件重定向的命令行参数。我使用的命令是./a.out

我正在尝试读取已从文件重定向的命令行参数。我使用的命令是./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