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
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[