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

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

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

  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>
  4. int main(int argc, char *argv[]){
  5. printf("Number of arguments : %d\n Arguments : ", argc);
  6. for(int i = 0; i<argc-1;i++){
  7. printf("%s\t", argv[i]);
  8. }
  9. }

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

  1. Number of arguments : 1
  2. Arguments : ./testFile

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

svdrlsy4

svdrlsy41#

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

  1. echo 1 > test1

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

  1. ./test < test1

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

  1. xargs test < test1

与您的问题无关:

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

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

展开查看全部
lvmkulzt

lvmkulzt2#

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

  1. ./test $(cat test1)

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

  1. ./test "$(cat test1)"

这也不同于:

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

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

相关问题