Head First C学习笔记 chapter3 由库代劳 命令行选项

1.很多程序都有命令行选项,如gcc -c

     使用库函数getopt(),每次调用,都会返回命令行中下一个参数。

     getopt(argc,argv,”o:p:t:”);

     argc和argv从命令行接收,第三个参数代表可以接受的选项,:表示,该选项后要接收一个参数。

     要使用它,需要包含unistd.h头文件,它不属于c标准库,而是POSIX库的成员。

2.例程

#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;
        }
    /*option index,I guess
     */
    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;
}

     2.1 getopt的调用

         

ch=getopt(argc,argv,”d:t”)

          读取一个-d或者-t选项,及-d的参数,如果是其他的字母,则不合法,输出错误到stderr并退出。

delivery = optarg;
//optarg表示读取到的选项的参数。
argc -= optind;
argv += optind;

     optarg表示读取到的选项的参数。           

    这两句代码感觉有点厉害……将argc的长度减少optind个,optind,从字面意思上看是选项索引,随着while循环增加。同时将argv这个指针数组的地址,偏移optind个成员(指针)长度。

puts("Ingredients:");
for(count=0;count<argc;count++)
    puts(argv[count]);
return 0;

          根据偏移后的位置和剩余的参数数量,将内容输出。 

3.其他要点

     可以合并两个选项,如 -td now,事实上我们也常这样做,如ps -asf

     可以改变选项顺序

     如果想输入负数,可以用—(两个连字符)隔开参数和选项,如set_temprature -c — -4,getopt遇到—,就会停止读取选项,程序会把后面的内容当成普通的命令行参数。 


你可能感兴趣的:(c,getopt,命令行参数,命令行选项)