C中主要参数

Ant*_*ony 59 c main-method command-line-arguments

我不知道该怎么办!我非常了解C基础知识.结构,文件IO,字符串等除了CLA之外的一切.出于某种原因,我无法理解这个概念.任何建议,帮助或建议.PS我是一个linux用户

cdh*_*wie 147

签名main是:

int main(int argc, char **argv);
Run Code Online (Sandbox Code Playgroud)

argc是指传入的命令行参数的数量,包括用户调用的程序的实际名称. argv包含实际参数,从索引1开始.索引0是程序名称.

所以,如果你像这样运行你的程序:

./program hello world
Run Code Online (Sandbox Code Playgroud)

然后:

  • argc将是3.
  • argv [0]将是"./program".
  • argv [1]将是"你好".
  • argv [2]将是"世界".

  • 例如,在Linux上你可能会看到某个文件来查看"somefile"的目录列表.这会将参数"-l"和"somefile"传递给"ls"程序.在Windows上,您可能"dir somefile",在这种情况下,单个"somefile"参数将传递给"dir"程序. (2认同)

Tob*_*oby 9

为了解析posix系统上的命令行参数,标准是使用getopt()库例程系列来处理命令行参数.

一个很好的参考是GNU getopt手册


小智 9

想象一下这样

*main() is also a function which is called by something else (like another FunctioN)

*the arguments to it is decided by the FunctioN

*the second argument is an array of strings

*the first argument is a number representing the number of strings

*do something with the strings
Run Code Online (Sandbox Code Playgroud)

也许一个示例程序woluld帮助.

int main(int argc,char *argv[])
{

    printf("you entered in reverse order:\n");

    while(argc--)
    {
        printf("%s\n",argv[argc]);
    }

return 0;
}
Run Code Online (Sandbox Code Playgroud)

它只是以相反的顺序打印你输入的所有内容,但你应该制作一些更有用的新程序.

编译它(如你好)从终端运行它与参数如

./hello am i here
Run Code Online (Sandbox Code Playgroud)

然后尝试修改它,以便它试图检查两个字符串是否相互反转,然后你需要检查argc参数是否正好是三个,如果还有什么打印错误

if(argc!=3)/*3 because even the executables name string is on argc*/
{
    printf("unexpected number of arguments\n");
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

然后检查argv [2]是否与argv [1]相反并打印结果

./hello asdf fdsa
Run Code Online (Sandbox Code Playgroud)

应该输出

they are exact reverses of each other
Run Code Online (Sandbox Code Playgroud)

最好的例子是文件复制程序试试它就像cp

cp file1 file2

cp是第一个参数(argv [0]而不是argv [1]),除非你需要引用或者某些东西,否则你应该忽略第一个参数

如果你制作了cp程序,你就明白了主要的args ......


小智 9

Siamore,我一直看到每个人都使用命令行来编译程序.我使用x11终端从ide通过code :: blocks,我的linux盒子上的gnu gcc编译器.我从来没有从命令行编译过程序.所以Siamore,如果我想让程序名称为cp,我是否初始化argv [0] ="cp"; Cp是一个字符串文字.什么去stdout进入命令行??? 你给我的例子Siamore我明白了!即使你输入的字符串长了几个字,它仍然只有一个arg.因为它被双引号括起来.所以arg [0],编程名称,实际上是你的字符串文字与新行字符?所以我理解为什么你使用if(argc!= 3)打印错误.因为prog name = argv [0]并且之后还有2个args,并且已经发生了错误.我还有什么其他理由呢?我真的认为我对如何从命令行或终端编译缺乏了解是我在这方面缺乏理解的原因!! Siamore,你帮助我理解了cla更好!仍然没有完全理解,但我并没有忘记这个概念.我将学习从终端编译然后重新阅读你写的内容.我敢打赌,那我就完全明白了!从你的一点点帮助大声笑

<>我自己没有写过的代码,但是来自我的书.

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;

    printf("The following arguments were passed to main(): ");
    for(i=1; i<argc; i++) printf("%s ", argv[i]);
    printf("\n");

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

这是输出:

anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man
The follow arguments were passed to main(): hey man
anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing?
The follow arguments were passed to main(): hi how are you doing?
Run Code Online (Sandbox Code Playgroud)

所以argv是一个字符串文字表,而argc是它们的数量.现在argv [0]是程序的名称.因此,如果我输入./CLA来运行程序./CLA是argv [0].上面的程序设置命令行以获取无限量的参数.如果我愿意,我可以将它们设置为只需3或4.就像一个或你的例子所示,Siamore ...... if(argc!= 3)printf("有些错误在这里"); 谢谢Siamore,没有你,不可能做到!感谢帖子的其余部分也是他们的时间和精力!

PS以防将来出现这样的问题...你永远不会知道大声笑问题是因为我使用的是IDE AKA Code :: Blocks.如果我要在上面运行该程序,它将打印程序的路径/目录.示例:〜/ Documents/C/CLA.c必须从终端运行并使用命令行进行编译.gcc -o CLA main.c,你必须在文件的目录中.


小智 6

Main就像任何其他函数一样,argc和argv就像任何其他函数参数一样,不同之处在于main从C Runtime调用并且它将参数传递给main,但是C runtime在c库中定义而你无法修改它,因此,如果我们在shell上执行程序或通过某些IDE执行程序,我们需要一种机制将参数传递给main函数,以便主函数在运行时的行为可能会有所不同,具体取决于您的参数.参数是argc,它给出了参数的数量,而argv是指向指针数组的指针,它将值保存为字符串,这样你可以传递任意数量的参数而不限制它,这是实现var args的另一种方式.

  • `main`是从阴极射线管调用的吗?您可能想要更新答案,说CRT表示"C运行时". (3认同)