c/c++處理參數

直接上代碼:涉及函數getopt(),getopt_long()

 1 #include <unistd.h>
 2 #include <stdlib.h>
 3 #include <stdio.h>
 4 #include <getopt.h>
 5 
 6 /*
 7 int main(int argc, char *argv[])
 8 {
 9     int opt;
10     char * optstring = "a:b:c:d";
11 
12     while ((opt = getopt(argc, argv, optstring)) != -1)
13     {
14         printf("opt = %c\n", opt);
15         printf("optarg = %s\n", optarg);
16         printf("optind = %d\n", optind);
17         printf("argv[optind - 1] = %s\n\n",  argv[optind - 1]);
18     }
19 
20     return 0;
21 }
22 */
23 
24 //getopt_long()和getopt_long_only()函數支持長選項的命令行解析,其中,后者的長選項字串是以一個短橫線開始的,而非一對短橫線。
25 int main(int argc, char **argv)
26 {
27    int opt;
28    int digit_optind = 0;
29    int option_index = 0;
30    char *optstring = "a:b:c:d";
31    static struct option long_options[] = { 
32        {"reqarg", required_argument, NULL, 'r'},
33        {"noarg",  no_argument,       NULL, 'n'},
34        {"optarg", optional_argument, NULL, 'o'},
35        {0, 0, 0, 0}
36    };  
37     /* 
38      *extern char *optarg;  //選項的參數指針
39      *extern int optind,   //下一次調用getopt時,從optind存儲的位置處重新開始檢查選項
40      *extern int opterr,  //當opterr=0時,getopt不向stderr輸出錯誤信息。
41      *extern int optopt;  //當命令行選項字符不包括在optstring中或者最后一個選項缺少必要的參數時,該選項存儲在optopt中,getopt返回'?’
42      *
43      */
44 
45    while ( (opt = getopt_long(argc, argv, optstring, long_options, &option_index)) != -1)
46    {
47         printf("opt = %c\n", opt);
48         printf("optarg = %s\n", optarg);
49         printf("optind = %d\n", optind);
50         printf("argv[optind - 1] = %s\n",  argv[optind - 1]);
51         printf("option_index = %d\n", option_index);
52    }
53 
54    return 0;
55 }

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

  該函數用來解析命令行參數。前兩個參數設為main函數的兩個參數。
  optstring設為由該命令要處理的各個選項組成的字符串。選項后面帶有冒號':'時,
  該選項是一個帶參數的選項。
  例如:make -f filename -n
    -f是一個帶參數的選項,-n是一個沒有參數的選項。

  可以下面這樣調用函數getopt來解析上面的例子。
    c = getopt(argc, argv, "f:n");
  此函數的返回值即為當前找到的命令選項,全部選項都找到時的返回值為-1。
  通常一個命令有多個選項,為了取得所有選項,需要循環調用此函數,直到返回值為-1。

  要使用此函數,還有幾個全局變量必須要了解。
    extern char *optarg;  
    extern int optind, opterr, optopt;

    optarg: 當前選項帶參數時,optarg指向該參數。
    optind: argv的索引。通常選項參數取得完畢時,通過此變量可以取得非選項參數(argv[optind])
    optopt: 一個選項在argv中有,但在optstring中不存在時,或者一個帶參數的選項沒有參數時,
? ? ? ?  getopt()返回'?',同時將optopt設為該選項。
    opterr: 將此變量設置為0,可以抑制getopt()輸出錯誤信息。

 int getopt_long(int argc, char * const argv[],

? ? ? ? ? ? ? ? ? const char *optstring,
? ? ? ? ? ? ? ? ? const struct option *longopts, int *longindex);

  這是支持長命令選項的函數,長選項以'--'開頭。
    前三個參數與函數getopt的參數是一樣的。只支持長選項時,參數optstring設置為NULL或者空字符串

  第四個參數是一個構造體struct option的數組。此構造體定義在頭文件getopt.h中。
  struct option {
    const char *name;
    int has_arg;
    int *flag;
    int val;
  };

  構造體各個成員的解釋如下
    name ? : 長選項的名字
    has_arg: no_argument或0表示此選項不帶參數,required_argument或1表示此選項帶參數,optional_argument或2表示是一個可選選項。
    flag : 設置為NULL時,getopt_long()返回val,設置為NULL以外時,getopt_long()返回0,且將*flag設為val。
    val : 返回值或者*flag的設定值。有些命令既支持長選項也支持短選項,可以通過設定此值為短選項實現。
  此數組的最后一個須將成員都置為0。

  關于返回值有以下幾種情況:
    識別為短選項時,返回值為該短選項。
    識別為長選項時,如果flag是NULL的情況下,返回val,如果flag非NULL的情況下,返回0。
    所有選項解析結束時返回-1。
    存在不能識別的選項或者帶參數選項的參數不存在時返回'?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287367.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

查缺補漏系統學習 EF Core 6 - 批量操作

推薦關注「碼俠江湖」加星標&#xff0c;時刻不忘江湖事這是 EF Core 系列的第七篇文章&#xff0c;上一篇文章講述了 EF Core 中的實體數據修改。這篇文章講一講 EF Core 如何進行批量操作。在眾多的 ORM 框架中&#xff0c;EF Core 的功能并不是最強大的那個&#xff0c;性能…

半小時一篇文過完C語言基礎知識點

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本文定位讀者為小白讀者&#xff0c;將使用最快的方法過完C語言基礎知識…

php變量的判空和類型判斷

&#xff08;1&#xff09;var_dump(); 判斷一個變量是否已經聲明并且賦值&#xff0c;并且打印類型和值 <?php $a; var_dump($a);//輸出null<?php var_dump($a);//輸出null<?php$a 10; var_dump($a);//輸出 int 10&#xff08;2&#xff09;isset() 判斷一個變量…

【Envi風暴】Envi插件大全:多波段拆分工具的巧妙使用

很多場合下需要做波段合成,比如波段432合成賦予紅綠藍,構造標準假彩色等等。合成后的文件通常包含多個單波段文件,在Envi中使用layer stacking工具將多個單波段數據合成為一個文件,如下所示: 那么問題來了,合成后的數據該怎樣拆開為原來的單波段呢?今天我們就來學習一種…

php表格怎么合并單元格格式化,table標簽的結構與合并單元格的實現方法

1.示例代碼&#xff1a;復制代碼 代碼如下:#1234一個完整的例子&#xff1a;復制代碼 代碼如下:#FirstnameLastnamePhoneQQ1qianshou111111111111111111112qianshou111111111111111111113qianshou111111111111111111114qianshou111111111111111111112.合并上下的單元格(rowspan…

Android之GridLayoutManager.setSpanSizeLookup問題

1 問題 利用BaseMultiItemQuickAdapter,用recycleView加載多布局,需要實現有些view顯示一行,有些一行顯示多個圖片。 在BaseMultiItemQuickAdapter適配器里面根據類型加載不同布局。 public ImageMultiItemAdapter(List<MultiItemEntity> data) {super(data);addIte…

《看聊天記錄都學不會C語言?太菜了吧》(9)老公餅真的有老公送?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

@Springboot搭建項目controller層接收json格式的對象失敗

今天在使用swagger2測試的時候出錯 1、requestBody注解常用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容&#xff0c;比如說&#xff1a;application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。 2、 通過req…

『技術群里聊些啥』HttpClient 如何判斷是同一終結點

前言官方文檔對 HttpClientHandler.MaxConnectionsPerServer 屬性有如下說明&#xff1a;獲取或設置使用 HttpClient 對象發出請求時允許的最大并發連接數&#xff08;每個服務器終結點&#xff09;。請注意&#xff0c;該限制針對每個服務器終結點&#xff0c;例如&#xff0c…

【Envi風暴】Envi 5.3 SP1經典安裝手把手圖文教程(含補丁文件)

Envi 5.3具有傳感器和數據支持、圖像處理和顯示、用戶界面、二次開發等新功能,本文講解Envi 5.3 SP1完全安裝教程。 下載后的軟件包目錄如下所示: 目錄 一、Envi 5.3 SP1安裝 二、Envi 5.3 SP1下載地址 一、Envi 5.3 SP1安裝 點擊IDL_ENVI5.3 SP1win64.exe,開始安裝,…

apache php url重寫語法,apache url重寫實現偽靜態

前段時間項目為了配合seo的工作&#xff0c;把現有的php網站改成靜態頁面&#xff0c;剛拿到需求時候第一感覺就是用靜態頁面啊&#xff0c;可是看了一會以后發現頁面有點多4、50個&#xff0c;沒辦法就用比較簡單的url重寫(apache的)吧&#xff0c;去掉這個前面的#,啟用它Load…

Android之用java的socket寫服務器提示java.net.BindException: Address already in use

1 問題 在Android activity里面Java socket服務器,然后關閉activity再打開activity開啟服務的時候提示錯誤如下 java.net.BindException: Address already in use 很明顯這個,IP和端口的的socket已經使用了,我們只需要在關閉activity的時候關閉serverSocket就行了。 2 解…

《看聊天記錄都學不會C語言?太菜了吧》(10)程序媛聰明絕頂了

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

List 集合轉換為String

開發中會用到把 List<string> 的內容拼接成以逗號分隔的字符串的形式,現總結如下&#xff1a; 方法一: public String listToString(List list, char separator) { StringBuilder sb new StringBuilder(); for (int i 0; i < list.size(); i) { …

[leetcode]Pascal#39;s Triangle II

問題敘述性說明&#xff1a; Given an index k, return the kth row of the Pascals triangle. For example, given k 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 思路&#xff1a; the mth element of the nth row of th…

遙感方法研究張掖市1999-2010年土地利用變化

【方法思路】:本文選取張掖地區兩期影像(Landsat 1999-07-07,2010-09-07),用監督分類方法獲取各期土地利用類型,與已有的土地利用現狀矢量圖(landuse2000)相疊加,通過對比分析,進而得出張掖市1999-2010年間土地利用變化情況。 一、實驗數據 采用Landsat Tm影像,原始…

【MongoDB】遞歸獲取字段更新表達式,更新復雜數據類型對象

在實際更新Mongo對象時發現&#xff0c;原有的更新代碼無法更新復雜的數據類型對象。恰好看到張占嶺老師有對該方法做相關的改進&#xff0c;因此全抄了下來。 總的核心思想就是運用反射與遞歸&#xff0c;對對象屬性一層一層挖掘下去&#xff0c;循環創建父類及之類的更新表達…

java openxml 操作 word,openxml word轉成xml

word2007無法打開Office Open XML 文檔由于種種原因&#xff0c;如程序安裝錯誤、注冊表被修改&#xff0c;或系統被病毒侵害等。有時候會造成WORD 2007無法打開.DOC文檔的問題&#xff0c;常規的處理辦法(右鍵選擇“打開方式”)無效。可以試試如下的方法 &#xff1a;1.打開注…

聊一聊CLR源碼中的 #define 是怎么玩的

一&#xff1a;背景 如果大家看過 CLR 源碼&#xff0c;會發現里面有很多 #define 宏定義,比如說 fusionhelpers.hpp 頭文件里。如果你不熟悉 C &#xff0c;看到這些 #define 應該會很暈的&#xff0c;這篇我們就來簡單聊聊 define 的玩法&#xff0c;其實說白了很簡單, #defi…

《看聊天記錄都學不會C語言?太菜了吧》(11)2分鐘領悟數組

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…