我有一个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
)
2条答案
按热度按时间svdrlsy41#
您将标准输入与命令参数混为一谈。
main
的argc
和argv
用于传递命令行参数。例如,在这里,外壳使用一个命令行参数(
1
字符)调用echo
,并将其标准输出附加到新打开的截断文件test
。在这里,运行带有0个参数的
test
的外壳程序及其标准输入附加到一个新打开的test1
文件。如果希望将
./test1
的内容转换为test
的命令行参数,可以使用xargs
完成。与您的问题无关:
条件应该是
i<argc
。像C和几乎所有其他语言中的所有数组一样,argv
的最小有效索引是0,最大有效索引是比它的长度小1。正如评论者指出的那样,argv[argc]
必须为空,因此从技术上讲,argc
比argv
的长度少一。lvmkulzt2#
如果希望
test1
的内容在argv
中可用,可以执行以下操作:请注意,这与以下内容有很大不同:
这也不同于:
第一个选项将文件的每个“单词”表示为不同的参数,而第二个选项将文件的内容表示为单个参数。单引号版本根本不会查看文件内部,这里包含它只是为了让您体验一下。