我如何处理main中的参数?

时间:2013-09-13 18:20:35

标签: c main

#include <stdio.h>

int main(int n){

int n;

printf("%d/n",n);

return 0;

}

我想知道主要论证中的论证是如何起作用的,并就这段代码的错误提出建议。

7 个答案:

答案 0 :(得分:3)

main函数原型只能是其中之一:

int main();

int main(int argc, char *argv[]); (*) Check my comment for this one.
int main(int argc, char **argv);

如果你看看最后两个原型,有两个论点。第一个是传递给程序的参数的数量,第二个是参数列表。第一个参数(argv[0])始终保留给程序名称。

所以你可以这样做:

int main(int argc, char** argv)
{
   int n = 0;
   if(argc > 1)
   {
       // Paramenters are sent as strings, so you need to cast it to the int
       char *end;
       n = strtol(argv[1], &end, 10);
       if (*end)
       {
            printf("Please pass the number for the argument!");
            return 0;
       }
       printf("%d\n", n);
   }

   return 0;
}

现在,您可以将该参数传递给程序(./program_name 15)并将其打印出来。

注意: atoi此处仅用于演示目的。

引自标准:

  

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应该使用返回类型int和no来定义   参数:

int main(void) { /* ... */ }
  

或有两个参数(这里称为argc和argv,但可能有任何名称   使用,因为它们是声明它们的函数的本地函数):

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

或等效的;)或其他一些实现定义的方式。

     

如果声明它们,主函数的参数应遵循以下内容   约束:

  1. argc的值应为非负值。
  2. argv [argc]应为空指针。
  3. 如果argc的值大于零,则数组成员argv [0]到argv [argc-1]包含指向字符串的指针,在程序启动之前由主机环境给出实现定义的值。目的是在程序启动之前从托管环境中的其他地方向程序提供信息。如果主机环境不能提供大写和小写字母的字符串,则实现应确保以小写形式接收字符串。
  4. 如果argc的值大于零,则argv [0]指向的字符串表示程序名称;如果程序名不能从主机环境获得,则argv [0] [0]应为空字符。如果argc的值大于1,则argv [1]指向的字符串 argv [argc-1]代表程序参数。
  5. 参数argc和argv以及argv数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。

答案 1 :(得分:2)

根据语言标准,main采用以下形式之一:

int main( void )

int main( int argc, char **argv ) // or char *argv[]

在第二种形式中,argc包含传递给main的命令行参数的数量,而argv是包含参数本身的字符串的向量。第一个参数(argv[0])是用于调用程序的命令,因此argc始终至少为1 1

实现可以自由地为main定义其他签名 - 检查编译器文档。

快速而肮脏的示例:从命令行中取两个整数,添加它们并打印结果(假定为C99):

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int convert( char *arg, int *val )
{
  int result = 1;
  char *chk;
  int x = strtol( arg, &chk, 10 );
  if ( !isspace( *chk ) && *chk != 0 )
  {
    result = 0;
    fprintf( stderr, "%s is not a valid integer!\n", arg );
    return 0;
  }
  *val = x;
  return 1;
}

int main( int argc, char **argv )
{
  if ( argc < 3 )
  {
    fprintf( stderr, "USAGE: %s x y\n", argv[0] );
    exit( 0 );
  }

  int x, y;
  if ( convert( argv[1], &x) && convert( argv[2], &y ))
  {
    printf( "%d\n", x + y );
  }
  return 0;
}

啊,谁打破了IE的代码格式?!

<小时/> 1。这适用于所谓的托管实现;基本上,任何在操作系统下运行的东西。还有独立式实现,它们通常是嵌入式系统,并且可以任意方式自由定义程序入口点。

答案 2 :(得分:1)

要使用参数,您需要两个参数:

#include <stdio.h>

int main (int argc, char *argv[])
{
  //Do someting with argv

  return 0;
}
  • argv是一个字符串数组,它们以null结尾并包含参数(第一个参数是可执行文件的名称)。

  • argc是参数计数(数组argv的长度)。

您的代码可以这样工作:

#include <stdio.h>

int main(int argc, char *argv[]){  
    if(argc > 1)
        printf("%s\n",argv[1]);
    else
        printf("argument missing.\n");

    return 0;
}

答案 3 :(得分:1)

你应该替换你的主要功能:

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

    for(int i = 0; i < argc; i++){
        printf("%s\n",argv[i]);
    }

    return 0;

}

然后,当您从控制台调用程序时

./foo 1 2 3

您将获得以下输出:

foo
1
2
3

答案 4 :(得分:1)

main的参数的工作方式如下:

int main(int argc, char ** argv) {
  // your code
}

您将此文件编译为二进制文件,将其称为yourbin,然后在shell中执行它:

./yourbin arg1 arg2

argc的值是传入的参数数量,在本例中为2,argv是指向C字符串数组的指针,在本例中为"./yourbin", "arg1", "arg2"

因此,您的整数n将是从命令行传入的参数数量。

答案 5 :(得分:0)

在这种情况下你不需要参数,因为你什么都不做。但是你可能需要它来做类似的事情。您的代码将无法编译,因为int main(int)不是C提供的重载主要方法之一。

#include <stdio.h>
int  anotherMethod(int a);
int main(){

int n = anotherMethod(5);

printf("%d/n",n);

return 0;

}

int  anotherMethod(int a){
   a = a + 5;
   return a;
}

可以将参数传递给main,以便在命令行参数中使用。

答案 6 :(得分:0)

我建议在C

中阅读一些关于范围的内容

以下是What IBM has to say about及其中的一些链接 C tutorial

在这种情况下,如果您想在程序中使用n变量,可以查看第一条评论