1. 程式人生 > >getopt函式分析命令列引數

getopt函式分析命令列引數

函式宣告

int getopt(int argc,char * const argv[ ],const char * optstring);

函式說明

getopt()用來分析命令列引數。引數argc和argv是由main()傳遞的引數個數和內容。
引數optstring則代表欲處理的選項字串。此函式會返回在argv中下一個的選項字母,此字母會對應引數optstring中的字母。如果選項字串裡的字母后接著冒號“:”,則表示還有相關的引數,全域變數optarg即會指向此額外引數。如果getopt()找不到符合的引數,則會打印出錯資訊,並將全域變數optarg設為“?”字元,如果不希望getopt()打印出錯資訊,則只要將全域變數opterr設為0即可。

返回值

getopt()每次呼叫會逐次返回命令列傳入的引數。
當沒有引數的最後的一次呼叫時,getopt()將返回-1。
當解析到一個不在optstring裡面的引數,或者一個必選值引數不帶值時,返回’?’。
當optstring是以’:’開頭時,缺值引數的情況下會返回’:’,而不是’?’ 。

全域性變數

  • char *optarg——當前選項引數字串(如果有)。

  • int optind——argv的當前索引值。當getopt()在while迴圈中使用時,迴圈結束後,剩下的字串視為運算元,在argv[optind]至argv[argc-1]中可以找到。

  • int opterr

    ——這個變數非零時,getopt()函式為“無效選項”和“缺少引數選項,並輸出其錯誤資訊。

  • int optopt——當發現無效選項字元之時,getopt()函式或返回’?’字元,或返回’:’字元,並且optopt包含了所發現的無效選項字元。

引數列表的定義

getopt()使用optstring所指的字串作為短引數列表,像ab:c::d就是一個短引數列表。短引數的定義是一個-後面跟一個字母或數字,像-a,-b就是一個短引數。每個數字或字母定義一個引數。

其中短引數在getopt定義裡分為三種:

  • 不帶值的引數,它的定義即是引數本身。
  • 必須帶值的引數,它的定義是在引數本身後面再加一個冒號。
  • 可選值的引數,它的定義是在引數本身後面加兩個冒號 。

注意

  • 引數的值與引數之間不能有空格,否則解析出錯。
  • 不帶值的引數可以連寫,也可以分開寫。
  • 引數不分先後順序。

例項

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

extern char* optarg; /*指向當前getopt()返回選項的引數(如果有)*/
extern int   optopt; /*當選項沒有出現在optstring中,或者選項缺少必要的引數時,該選項儲存在optopt中,getopt返回'?’*/
extern int   opterr; /*用於控制getopt()是否打印出錯資訊*/
extern int   optind; /*當前getopt()返回選項的下一個選項的索引(argv陣列)*/

int main(int argc, char* argv[])
{
    int opt = 0;

    opterr = 0; /*不要打印出錯資訊*/

    while((opt = getopt(argc, argv, "ab:c::d")) != -1) {
        switch (opt) {
            case 'a': //該選項不需要帶引數
                printf("選項:a,下一個選項:%s\n", argv[optind]);
                break;
            case 'b': //該選項必須帶引數
                printf("選項:b,帶的引數:%s\n", optarg);
                break;
            case 'c': //該選項帶的引數可選
                printf("選項:c,帶的引數:%s\n", optarg);
                break;
            case 'd': //該選項不需要帶引數
                printf("選項:d\n");
                break;
            case '?': //選項列表中沒有的,並儲存在optopt中
                printf("不知道的選項:%c\n", optopt);
                break;
            default:
                break;
        }
    }
    return 0;
}

執行結果

root@Qt:/home/user/share# ./a.out -acd
選項:a,下一個選項:-acd
選項:c,帶的引數:d
root@Qt:/home/user/share# 
root@Qt:/home/user/share# ./a.out -a -bABC -c
選項:a,下一個選項:-bABC
選項:b,帶的引數:ABC
選項:c,帶的引數:(null)
root@Qt:/home/user/share# 
root@Qt:/home/user/share# ./a.out -c123456 -k
選項:c,帶的引數:123456
不知道的選項:k
root@Qt:/home/user/share# ./a.out -a kill -c123456 -k
選項:a,下一個選項:kill
選項:c,帶的引數:123456
不知道的選項:k
root@Qt:/home/user/share# 

相關推薦

getopt函式分析命令引數

函式宣告 int getopt(int argc,char * const argv[ ],const char * optstring); 函式說明 getopt()用來分析命令列引數。引數argc和argv是由main()傳遞的引數個數和內容。

getopt.c 可在windows下分析命令引數,沒有實現getopt_long

可在windows下分析命令列引數,沒有實現getopt_long,程式碼的引數風格有點老,不過確實管用,可以在VC6.0上編譯通過和執行。 把這個兩個檔案加到工程,就可以實現命令列引數解析了,免得每次都要自己分析引數,痛苦死了。 getopt.h /* getopt.

C++-main函式命令引數

1、main函式的概念   C語言中main函式稱之為主函式    —個C程式是從main函式開始執行的  下面的main函式定義正確嗎? //1 main(){ } //2 void main(){ } //3 int main(){ } //4 int main(

getopt(win32) -- 命令引數解析函式

GNU libc提供了getopt和getopt_long用於解析命令列引數,很好用,想在windows下使用,就google了幾個win32下的C/C++寫得getopt,並作了一些比較。 程式裡往往會有許多開關的,執行時就要傳入許多引數值來開啟或關閉這些開關。以前

命令引數解析函式--getopt

原型: #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); 該函式的argc和argv引數通常直接從main()的引數直接傳遞而來。opt

linux命令引數解析函式 getopt

在學習開原始碼過程中,經常遇到命令列解析函式 getopt,網上查閱了一些資料,總結一下。 說到命令列解析,最簡單的方式就是利用c語言main函式的兩個引數argc和argv來實現,當 C 執行時庫程式啟動程式碼呼叫 main() 時,會將命令列的引數傳過來,引數個數放在a

命令引數選項處理:getopt()及getopt_long()函式使用

getopt() 所設定的全域性變數(在unistd.h中)包括: optarg——指向當前選項引數(如果有)的指標。 optind—— getopt() 即將處理的下一個引數 argv 指標的索引。 optopt——最後一個已知選項。 下面是一個使用getopt簡單例子: #include<st

Java的輸入和輸出、if...else if...else判斷、Java中列印陣列、Java中陣列排序、檢視函式方法的原始碼、命令引數

Java的輸入和輸出: 輸入: import java.util.Scanner Scanner s = new Scanner(System.in); //通過new Scanner(System.in)建立一個Scanner物件,控制檯會一直等待輸入,直到敲回車鍵

php在cli模式下取得命令中的引數的方法-getopt命令可傳遞陣列-簡單自定義方法取命令引數

  在cli模式下執行PHP時,自動給指令碼檔案傳遞了一個變數$argv,其值即是一個命令中所有值組成的陣列(以空格區分),在PHP程式中接收引數有3種方法1.直接使用argv變數陣列。 2.使用$_SERVER['argv']全域性變數來獲取,其值和1是一樣的。 3.使用getopt

python 命令引數解析 argparse簡單分析

在python 2.7 後,不推薦使用 optparse, 而推薦使用 argparse. 其它的不多說,簡單的分析下我遇到的問題:我是想用 argparse 來解析不定長的命令列引數 例如: import argparse import sys parser = ar

[Python小筆記]命令引數:sys.argv和getopt模組

一、sys.argv sys.argv 是命令列引數列表。 #test_sys_argv.py import sys print(sys.argv)#命令列引數列表 print(sys.argv[0]) print(len(sys.argv))#命令列引數列表個數 二、g

13.4 argparse--分析命令選項、引數功能

本模組主要為了方便實現命令列引數處理,或者分析命令列引數。建立命令列引數分析器:#python 3.4import argparseparser = argparse.ArgumentParser(description='Process some integers.')pr

python命令引數處理:argparse、optparse和getopt

一 命令列引數: (1)在python中: *sys.argv:命令列引數的列表。 *len(sys.argv):命令列引數的個數(argc)。 *python中提供了三個模組來輔助處理命令列引數:getopt,optparse和argparse。 (2)術語: *arg

命令引數解析函式getopt_long() 使用詳解

當一個用C語言編寫的Linux或UNIX程式執行時,它是從main函式開始的。對這些程式而言,main函式的宣告如下所示: int main(int argc, char *argv[]) 其中argc是程式引數的個數(int),argv是一個代表引數自身的

在Perl中使用Getopt::Long模組來接收使用者命令引數

我們在linux常常用到一個程式需要加入引數,現在瞭解一下 perl 中的有關控制引數的模組 Getopt::Long ,比直接使用 @ARGV 的陣列強大多了.我想大家知道在 Linux 中有的引數有二種形式. •長引數  –help •短引數   -h 也就是-和–的分別.–表示完整引數.-表示簡化

springboot原始碼分析5-springboot之命令引數以及原理

摘要:本文我們重點分析一下Springboot框架中的命令列引數的使用以及框架內部處理的命令列引數的原理。眾所周知,springboot專案可以有兩種方式啟動,第一種使用jar包;第二種使用war包。在使用jar方式的時候,我們可以在啟動jar包的時候設定一些命令引數。1.1

linux開發 -- 命令引數解析 getopt

linux大部分工具都是以命令列方式執行,因此都需要對命令列引數解析,它們大多都是用相同的解析方法!(有點廢話)再次記錄下來!省得以後再查。大部分軟體都是用getopt系列函式解析命令列,glibc中就提供了該函式的實現,即使沒有依賴glibc,其他軟體包也會提供相應的實現。

在 Perl 中使用 Getopt::Long 模組來接收使用者命令引數 z

初始化 Perl命令列中所接受的引數,簡化了命令列引數的解析。下面看程式的例子 #!/usr/bin/perl use strict; use Getopt::Long; use Smart::Comments; my @libs    = (); my %flags   = (); my ( $verbos

getopt、getopt_long和getopt_long_only解析命令引數

一:posix約定:          下面是POSIX標準中關於程式名、引數的約定:          程式名不宜少於2個字元且不多於9個字元;          程式名應只包含小寫字母和阿拉伯數字;          選項名應該是單字元或單數字,且以短橫 ‘-’ 為

命令引數:關於java程式中main函式的String[] args引數的用法

剛開始學習Java的時候,我們並沒有在意main方法裡面的“String[] args”引數,但既然其存在,那必然有其相應的作用。 首先,我們給出一個函式: public class Test { public static void main(String[