文档章节

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

AlexTuan
 AlexTuan
发布于 2016/01/30 22:50
字数 500
阅读 77
收藏 5

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遇到—,就会停止读取选项,程序会把后面的内容当成普通的命令行参数。 


© 著作权归作者所有

共有 人打赏支持
AlexTuan
粉丝 3
博文 27
码字总数 17966
作品 0
程序员
私信 提问
makefile文件的一些解读

这篇文章算是一个学习的笔记吧,在很多的程序构建过程中的一些东西 gcc编程的四个步骤 命令格式如下 其中[目标文件]可以缺省,Gcc默认生成可执行的文件名为:要编译的文件.out 例子: 编译的...

hit2015spring
2017/05/28
0
0
R 学习笔记《二》 R语言初学者指南

1 录入少量数据。 打开Tinn R输入 然后粘贴到R控制台 Wing1 <- 59 Wing2 <- 55 Wing3 <- 53.5 Wing4 <- 55 Wing5 <- 52.5 其实就是赋值运算,左边表示变量,<-符号也可以用=替换。 查看输入的...

varlardoha
2013/01/16
0
3
git 安装使用笔记

Git安装以及使用Git 管理个人文档 1.1 Git 安装 Git的最新版本可以在http://git-scm.com/ 下载 ,它是基于命令行操作的,网上也有第三方开发的相应GUI可供下载,因为我比较喜欢命令行操作,所...

鉴客
2011/08/09
11.2K
10
学习笔记——ldconfig

ldconfig命令的作用 ldconfig是一个动态链接管理库的命令,其目的是为了让动态链接库为系统所共享。 ldd:查看程序依赖库 用途:默认搜寻/lib和/usr/lib,以及动态库配置文件/etc/ld.so.conf...

清风与你
2017/02/20
0
0
git学习笔记之1 Git 内部原理 - 底层命令和高层命令

底层命令 (Plumbing) 和高层命令 (Porcelain) 本书讲解了使用 checkout, branch, remote 等共约 30 个 Git 命令。然而由于 Git 一开始被设计成供 VCS 使用的工具集而不是一整套用户友好的 VC...

mmh19891113
01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
22分钟前
1
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
52分钟前
2
0
SpringBoot 整合异步调用方法

1. 在 SpringBoot 主类上使用 @EnableAsync 注解,开启异步调用功能 package com.codingos.springbootdemo;import org.springframework.boot.SpringApplication;import org.springfra......

北漂的我
今天
1
0
0015-如何使用Sentry管理Hive外部表权限

1.文档编写目的 本文档主要讲述如何使用Sentry对Hive外部表权限管理,并基于以下假设: 1.操作系统版本:RedHat6.5 2.CM版本:CM 5.11.1 3.集群已启用Kerberos和Sentry 4.采用具有sudo权限的...

Hadoop实操
今天
3
0
边缘计算与数据中心的发展趋势

导读 Gartner研究表明,人工智能、物联网和5G助力下一代商业创新,由此产生大量数据,2020年前企业将使用超过75亿台联网设备。 在几乎每个方面,社会的节奏都正变得更快。我们希望客户服务问...

问题终结者
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部