70

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

4

6 回答 6

171

的签名main是:

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

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

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

./program hello world

然后:

  • argc 为 3。
  • argv[0] 将是“./program”。
  • argv[1] 将是“你好”。
  • argv[2] 将是“世界”。
于 2010-11-14T05:40:27.893 回答
10

想象一下这样

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

它只是以相反的顺序将您输入的所有内容打印为 args,但您应该制作新的程序来做一些更有用的事情。

编译它(打个招呼)从终端运行它,参数如下

./hello am i here

然后尝试修改它,以便它尝试检查两个字符串是否相互反转然后您将需要检查 argc 参数是否正好是 3,如果还有其他打印错误

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 文件1 文件2

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

如果您制作了 cp 程序,那么您真的了解主要参数...

于 2010-11-14T19:18:32.177 回答
9

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

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

于 2010-11-14T05:44:25.740 回答
9

Siamore,我一直看到每个人都使用命令行编译程序。我通过 code::blocks 从 ide 使用 x11 终端,这是我的 linux 机器上的一个 gnu gcc 编译器。我从来没有从命令行编译过程序。所以 Siamore,如果我希望程序名称是 cp,我是否初始化 argv[0]="cp"; Cp 是一个字符串文字。任何进入标准输出的东西都在命令行上???你给我的例子 Siamore 我明白了!尽管你输入的字符串只有几个单词,但它仍然只有一个 arg。因为它是用双引号括起来的。所以 arg[0],prog 名称,实际上是你的字符串文字,带有换行符?所以我理解你为什么使用 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("Some error goes here"); 谢谢Siamore,没有你就做不到!还要感谢帖子的其余部分所付出的时间和精力!

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

于 2010-11-16T06:07:58.820 回答
6

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

于 2010-11-14T11:01:42.420 回答
3

对@anthony 代码做了一个小改动,这样我们就可以得到带有参数编号和值的格式良好的输出。当您有多个参数时,以某种方式更容易阅读输出:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("The following arguments were passed to main():\n");
    printf("argnum \t value \n");
    for (int i = 0; i<argc; i++) printf("%d \t %s \n", i, argv[i]);
    printf("\n");

    return 0;
} 

输出类似于:

The following arguments were passed to main():
0        D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe
1        -P
2        TestHostAttoshiba
3        _http._tcp
4        local
5        80
6        MyNewArgument
7        200.124.211.235
8        type=NewHost
9        test=yes
10       result=output
于 2016-12-08T13:31:03.933 回答