#include <stdio.h>
int main(int n){
int n;
printf("%d/n",n);
return 0;
}
我想知道主要作品中的论证方式,并就我用这段代码做错了什么征求意见。
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("%dn", n);
}
return 0;
}
现在,您可以将该参数传递给程序(./program_name 15
),它应该将其打印出来。
注意:此处atoi
仅用于演示目的。
标准报价:
程序启动时调用的函数名为
main
。实现声明否 此函数的原型。它应使用返回类型 int 和 no 参数:
int main(void) { /* ... */ }
或具有两个参数(此处称为 argc 和 argv,尽管任何名称都可以是 使用,因为它们是声明它们的函数的本地):
int main(int argc, char *argv[]) { /* ... */ }
或同等学历;)或以某种其他实现定义的方式。
如果声明了,则主函数的参数应遵循以下内容 约束:
- argc 的值应为非负值。
- argv[argc] 应为空指针。
- 如果 argc 的值大于零,则包含的数组成员 argv[0] 到 argv[argc-1] 应包含指向字符串的指针,这些字符串在程序启动之前由主机环境给出实现定义的值。目的是向程序提供在程序启动之前从托管环境中的其他位置确定的信息。如果主机环境无法提供大写和小写字母的字符串,则实现应确保以小写形式接收字符串。
- 如果 argc 的值大于零,则 argv[0] 指向的字符串表示程序名;如果程序名在主机环境中不可用,则 argv[0][0] 应为空字符。如果 argc 的值大于 1,则 argv[1] 指向的字符串通过argv[argc-1] 表示程序参数。 参数 argc 和 argv 以及
- argv 数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。
根据语言标准,main
采用以下形式之一:
int main( void )
或
int main( int argc, char **argv ) // or char *argv[]
在第二种形式中,argc
包含传递给main
的命令行参数的数量,而argv
是包含参数本身的字符串向量。 第一个参数(argv[0]
)是用来调用程序的命令,所以argc
总是至少为11。
实现可以自由定义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 yn", argv[0] );
exit( 0 );
}
int x, y;
if ( convert( argv[1], &x) && convert( argv[2], &y ))
{
printf( "%dn", x + y );
}
return 0;
}
啊,谁破坏了IE的代码格式?!
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("%sn",argv[1]);
else
printf("argument missing.n");
return 0;
}
你应该替换你的主函数:
int main(int argc, char* argv[]){
for(int i = 0; i < argc; i++){
printf("%sn",argv[i]);
}
return 0;
}
然后,何时从控制台调用程序
./foo 1 2 3
你会得到下面的输出:
foo
1
2
3
main
工作的论证方式是这样的:
int main(int argc, char ** argv) {
// your code
}
您将此文件编译为二进制文件,将其称为 yourbin
,然后在 shell 上执行它时:
./yourbin arg1 arg2
argc
的值是传入的参数数,在本例中为 2,argv
是指向 C 字符串数组的指针,在本例中为 "./yourbin", "arg1", "arg2"
因此,整数n
是从命令行传入的参数数。
在这种情况下,您不需要该参数,因为您没有对其进行任何操作。但是您可能需要它来执行与此类似的事情。您的代码无法编译,因为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 以在命令行参数中使用。
我建议在 C 语言中阅读一些关于范围的信息
这里有一些关于 IBM 必须说什么的链接,以及这个C 教程
在这种情况下,如果您想在程序中使用 n 变量,您可以检查第一条注释