http://www.youtube.com/watch?v=SjyR74lbZOc 这个视频比较专业,可爱
http://www.youtube.com/watch?v=15nClbf4gAY 这个视频比较实在
https://www.cs.rutgers.edu/~pxk/416/notes/c-tutorials/getopt.html
http://www.ibm.com/developerworks/aix/library/au-unix-getopt.html
命令行的:http://wiki.bash-hackers.org/howto/getopts_tutorial
中文的:http://blog.sina.com.cn/s/blog_6aea878e0100stkd.html
Terminology(术语)
假设有程序
./order_pizza -t -d now anchovies pineapple
那么./order_pizza叫做name of the program
-t是第一个option, 不带参数 (表示是否为厚皮 thick crust)
-d now是第二个option, 表示delivery(派送时间), d是option的名称, now是d的参数.
anchovies和pineapple是第1个argument和第2个argument, 表示pizza的配料.
options 和 arguments的关系
P155 有句话很精典:
Command-line options are command-line arguments prefixed with “-”.
用法
前面已经给出了很多参考链接,讲的都很过细, 简单说一下,查看man 3 getopt可以得知,头文件unistd.h中有定义
int getopt(int argc, char* const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt;那么getopt每次返回一个option(包括其带的参数),option的名称保存在optopt中(char型), 选项值保存在optarg中 (char*类型)
第三个参数char *optstring形如x:y:z , 如果跟:表示这个选项带一个参数,比如这里的x, 和y, 如果跟两个::表示这个选项的参数是可选的
如果getopt碰到不认识的option,它返回?, 如果options部分已经结束了(没有以-开始的参数或碰到--), 它返回-1
optarg是option argument的缩写
optind是option index的缩写,表示下一个将要处理的参数的下标.
通过argc-=optind及 argv+=optind可以让程序在处理完options部分后直接定位到真正的arguments部分.
关于什么是options什么是arguments,前面的术语部分已经给出.
代码
#include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]){ char* delivery = ""; int thick = 0; int count = 0; char ch; while((ch = getopt(argc, argv, "d:t")) != EOF){ switch(ch){ case 'd': delivery = optarg; break; case 't': thick = 1; break; default: fprintf(stderr, "Unknown option: '%s'\n", optarg); return 1; } } argc -= optind; argv += optind; if(thick) puts("Thick crust."); if(delivery[0]) printf("To be delivered %s.\n", delivery); puts("Ingredients:"); for(count = 0; count < argc; count++){ puts(argv[count]); } return 0; }
编译,运行
gcc -o order_pizza 150.c ./order_pizza -t -d now Anchovies Pineapple 或 ./order_pizza -td now Anchovies Pineapple那么Anchovies之前的部分-t -d now 叫 options, 从Anchovies开始的参数叫 arguments,
参考:head first c