C中main的参数[duplicate]

3phpmpom  于 2023-10-16  发布在  其他
关注(0)|答案(6)|浏览(92)

此问题已在此处有答案

Pass arguments into C program from command line(6个回答)
六年前就关门了。
我不知道该怎么办!我对C语言的基础知识非常了解。结构、文件IO、字符串等。除了CLA由于某种原因,我无法理解这个概念。任何建议,帮助或建议。PS我是Linux用户

o2g1uqev

o2g1uqev1#

main的签名是:

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

argc是指传入的命令行参数的数量,其中包括用户调用的程序的实际名称。argv包含实际参数,从索引1开始。索引0是程序名。
所以,如果你像这样运行你的程序:

./program hello world

然后又道:

  • argc将是3。
  • argv[0]应该是“./program”。
  • argv[1]是“hello”。
  • argv[2]是“世界”。
wmtdaxz3

wmtdaxz32#

想象一下

*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参数是否正好是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程序,你真的理解了主要的参数。

goucqfw6

goucqfw63#

在posix系统上解析命令行参数的标准是使用getopt()系列的库例程来处理命令行参数。
一个很好的参考是GNU getopt manual

dhxwm5r4

dhxwm5r44#

Siamore,我一直看到每个人都使用命令行编译程序。我通过code::blocks使用ide中的x11终端,code::blocks是我的Linux机器上的gnu gcc编译器。我从来没有从命令行编译过程序。
所以如果我想让程序名为cp,我应该把argv[0]="cp"; Cp初始化为字符串文字吗?stdout的任何内容都在命令行上???我明白你举的例子!即使您输入的字符串有几个单词长,它仍然只有一个参数。因为它被双引号包围着。所以arg[0],程序名,实际上是你的字符串文字与一个新的行字符??所以我理解你为什么使用if(argc!=3)打印错误。因为prog name = argv[0]之后还有2个args,并且再次发生错误。
我还有什么理由用这个?我真的认为我对如何从命令行或终端编译缺乏理解是我在这方面缺乏理解的原因!西摩,你让我更了解中情局了!我仍然不完全理解,但我并没有忘记这个概念。我要学习从终端编译然后重读你写的东西。我敢打赌,然后我会完全理解!在你的帮助下,LOL
<>代码不是我自己写的,而是我的书。

#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个。就像你举的一个例子一样,西摩... if(argc!=3) printf("Some error goes here");
感谢你的评分没有你我不可能做到,感谢所有人的时间和努力!
PS万一有这样的问题在未来.你永远不知道LOL的问题是因为我使用的IDE AKA代码::块。如果我运行上面的程序,它会打印程序的路径/目录。
例如:~/Documents/C/CLA.c它必须从终端运行并使用命令行编译。gcc -o CLA main. c,并且您必须位于该文件的目录中。

6tqwzwtp

6tqwzwtp5#

Main和其他函数一样,argc和argv也和其他函数一样,不同的是main是从C语言调用的,它把参数传递给main,但是C语言是在C库中定义的,你不能修改它,所以如果我们在shell或IDE上执行程序,我们需要一种机制来传递参数到main函数,这样你的main函数就可以根据你的参数在运行时有不同的行为。参数是argc,它给出了参数的数量,argv是指向指针数组的指针,它将值保存为字符串,这样你就可以传递任意数量的参数而不受限制,这是实现var args的另一种方式。

nhjlsmyf

nhjlsmyf6#

对@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

相关问题