C中主要参数

时间:2010-11-14 05:37:17

标签: c command-line-arguments main-method

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

5 个答案:

答案 0 :(得分:138)

main的签名是:

int main(int argc, char **argv);

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

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

./program hello world

然后:

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

答案 1 :(得分:9)

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

一个很好的参考是GNU getopt manual

答案 2 :(得分: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

也许一个示例程序需要帮助。

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

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

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

return 0;
}

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

编译它(如你好)用终端用

这样的参数运行它
./hello am i here

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

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

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

./hello asdf fdsa

应输出

they are exact reverses of each other

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

cp file1 file2

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

如果你制作了cp程序,你真的理解了主要的args ......

答案 3 :(得分:8)

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;
} 

这是输出:

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?

所以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,你必须在文件的目录中。

答案 4 :(得分:6)

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