将文件内容传递给c可执行文件似乎不起作用,

m1m5dgzv  于 2022-10-17  发布在  Unix
关注(0)|答案(2)|浏览(190)

我有一个c可执行文件,名为testFile文件,其中包含以下代码:


# include <stdio.h>

# include <stdlib.h>

# include <string.h>

int main(int argc, char *argv[]){
    printf("Number of arguments : %d\n Arguments : ", argc);
    for(int i = 0; i<argc-1;i++){
        printf("%s\t", argv[i]);
    }
}

以及一个名为test1的文件,其中只包含数字1(echo 1 > test1)
当我在命令行(zsh)上调用此行时:
./test < test1
我得到的输出是:

Number of arguments : 1
Arguments : ./testFile

这不是应该显示两个论点吗?和角色1一起?我想找到一种方法使这个1出现在参数列表中,可以吗?或者,这只是我的外壳处理以这种方式传递的参数的方式?(我觉得很奇怪,因为cat < test1打印1)

svdrlsy4

svdrlsy41#

您将标准输入与命令参数混为一谈。
mainargcargv用于传递命令行参数。
例如,在这里,外壳使用一个命令行参数(1字符)调用echo,并将其标准输出附加到新打开的截断文件test

echo 1 > test1

在这里,运行带有0个参数的test的外壳程序及其标准输入附加到一个新打开的test1文件。

./test < test1

如果希望将./test1的内容转换为test的命令行参数,可以使用xargs完成。

xargs test < test1

与您的问题无关:

for(int i = 0; i<argc+1;i++){

条件应该是i<argc。像C和几乎所有其他语言中的所有数组一样,argv的最小有效索引是0,最大有效索引是比它的长度小1。正如评论者指出的那样,argv[argc]必须为空,因此从技术上讲,argcargv的长度少一。

lvmkulzt

lvmkulzt2#

如果希望test1的内容在argv中可用,可以执行以下操作:

./test $(cat test1)

请注意,这与以下内容有很大不同:

./test "$(cat test1)"

这也不同于:

./test '$(cat test1)'.  # Does not do at all what you want!

第一个选项将文件的每个“单词”表示为不同的参数,而第二个选项将文件的内容表示为单个参数。单引号版本根本不会查看文件内部,这里包含它只是为了让您体验一下。

相关问题