在Linux中,Linux终端提供类的UNIX命令行环境。命令行是在命令行环境中,用户为运行程序输入命令行。在Linux用到的命令常常支持很多参数,第一个想到就是main函数命令行传参,读取在同一行附加项。
带参数的main
c编译器允许main没有参数,也可以main函数带参数。我们常见的就是main函数带两个参数(一些实现运行main函数有更多参数)。当main函数有两个参数时,第一个参数时命令行的字符串的数量。而第二个参数是把每个字符串的地址存储在指针数组中。
#include <stdio.h>
int main(int argc,char **argv)
{
int i = 0;
for (i = 0;i < argc;i++)
{
printf(" %d: %s\n",i,argv[i]);
}
return 0;
}
运行结果:
argc代表输入的参数个数,而argv中保存着参数具体的值。
注意:char **argv与char *argv[]等价。argv是一个指向指针的指针。
main函数读取命令行参数,把字母数字转换成整数
#include <stdio.h>
#include <stdlib.h>
int factorial(int n);
int main(int argc, char **argv)
{
int num = 0;
if (argc < 2)
{
printf("Usage:%s\n", argv[0]);
return -1;
}
else
{
num = atoi(argv[1]);
if (num > 12)
{
printf("Keep input under 13.\n");
return -1;
}
printf("factorial of %d is %d\n",num, factorial(num));
}
return 0;
}
int factorial(int n)
{
if (n <= 1)
return 1;
else
return factorial(n - 1)*n;
}
运行结果:
如果运行程序时没有提供命令行参数,那么argc < 2 为真,程序将给出提示信息。如果要计算超过12!的阶乘,必须使用能表示的更大范围的类型,例如 double 或 long long。
getopt 分析命令行参数
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int opterr, optind, optopt;
返回值:
返回命令行中指定的下一个选项字符。
getopt()函数是一个命令行解析器。参数argc和argv是传递给main()的参数计数和参数数组。参数optstring是一个可识别的选项字符字符串;如果一个字符后面跟着一个<冒号>,那么该选项接受一个参数。
getopt()第三个参数optstring
指的是你支持的选项,假设你的程序支持-a,-b,-c选项,并且-c选项后面要跟具体参数,那么optstring可以是:
"abc:"
选项后面有一个冒号表示这个选项需要带参数。
getopt 的外部变量
extern char *optarg;
extern int opterr, optind, optopt;
optind 存放下一个要处理的字符串在argv数组中的下标,argv[optind];
opterr 如果选项发生错误,应用程序没有将变量opterr设置为0。
optopt 如果选项处理发生错误,它会指向导致出错的选项字符串
optarg 如果一个选项需要参数,如前面提到的c参数,由于后面有:,所以它需要参数,处理到它时,optarg会指向这个参数。
#include <stdio.h>
#include <unistd.h> //getopt
extern int optind,opterr,optopt;
extern char *optarg;
int main(int argc,char **argv)
{
int c = 0;
while(EOF != (c = getopt(argc,argv,"abc:")))
{
switch(c)
{
case 'a':
printf("option a:\n");
break;
case 'b':
printf("option b:\n");
break;
case 'c':
printf("we get option -n,para is %s\n",optarg); //由于c后面有:,必须要有参数,optarg会指向这个参数。
break;
case '?':
printf("unknow option:%c\n",optopt);//表示选项不支持
break;
default:
break;
}
}
return 0;
}
输入正常选项时,我们可以看到能正确获取到选项,如果不是,则提示无效的操作。
转载:https://blog.csdn.net/chen1415886044/article/details/102404995