Sword 第三方庫介紹一

/* 獲取字符編碼 */

#include <stdio.h>
#include <stdlib.h>  /* calloc()函數頭文件 */
#include <string.h>
#include <assert.h>
#include "uchardet.h"

void test()
{
    uchardet_t ud;
    const char *p = "一開始 金星實際上 和 地球 是姊妹星球 。";
    const char *pcCode = NULL;

    do 
    {
        //1.初始化
        ud = uchardet_new();

        //2.分析樣本字符串
        if (uchardet_handle_data(ud, p, strlen(p)))
        {
            printf("---uchardet_handle_data() failed----\n");
            break;
        }

        //3.關閉樣本分析
        uchardet_data_end(ud);

        //4.打印當前字符串的編碼
        pcCode = uchardet_get_charset(ud);
        if (pcCode)
        {
            printf("------current code is [%s]------------\n", pcCode);
        }
        else
        {
            printf("---uchardet_get_charset() failed----\n");
        }

    } while (0);

    //5.關閉資源
    uchardet_delete(ud);

}

int main()
{
    test();
    return 0;
}
/* 命令行參數解析 */

#include <stdio.h>
#include <stdlib.h>  /* calloc()函數頭文件 */
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <getopt.h>

/*
知識補充:
    A.命令行參數說明
        命令行參數能夠分爲兩類,一類是短選項,一類是長選項,短選項在參數前加一槓"-",長選項在參數前連續加兩槓"--",
        例如 -a,-A,-b都表示短選項,--all,--almost-all, --author都表示長選項。
        他們二者後面均可選擇性添加額外參數。例如--block-size=SIZE,SIZE即是額外的參數。

    B.getopt_long函數介紹

        函數原型
        int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

        功能說明:getopt_long函數既能夠處理短選項也能夠處理長選項

        參數說明
        argc: 同main()函數中的argc
        argv: 同main()函數中的argv
        optstring: 表示短選項字符串。
            形式如「a:b::cd:「,分別表示程序支持的命令行短選項有-a、-b、-c、-d,冒號含義以下:
                (1)只有一個字符,不帶冒號——只表示選項, 如-c 
                (2)一個字符,後接一個冒號——表示選項後面帶一個參數,如-a 100
                (3)一個字符,後接兩個冒號——表示選項後面帶一個可選參數,即參數無關緊要,若是帶參數,則選項與參數直接不能有空格形式應該如-b200
        longopts:表示長選項結構體

        struct option
        {
            const char * name;
            int has_arg;
            int *flag;
            int val;
        };

        eg:
        static struct option longopts[] = {
              { "daemon", no_argument, NULL, 'D' },
              { "dir", required_argument, NULL, 'd' },
              { "out", required_argument, NULL, 'o' },
              { "log", required_argument, NULL, 'l' },
              { "split", required_argument, NULL, 's' },
              { "http-proxy", required_argument, &lopt, 1 },
              { "http-user", required_argument, &lopt, 2 },
              { "http-passwd", required_argument, &lopt, 3 },
              { "http-proxy-user", required_argument, &lopt, 4 },
              { "http-proxy-passwd", required_argument, &lopt, 5 },
              { "http-auth-scheme", required_argument, &lopt, 6 },
              { "version", no_argument, NULL, 'v' },
              { "help", no_argument, NULL, 'h' },
              { 0, 0, 0, 0 }
        };
        name:表示選項的名稱,好比daemon,dir,out等。

        has_arg:表示選項後面是否攜帶參數。
        該參數有三個不一樣值,以下:
        a: no_argument(或者是0)時,參數後面不跟參數值,eg: --version,--help
        b: required_argument(或者是1)時,參數輸入格式爲:(參數 值) 或者 (參數=值)。eg:--dir=/home
        c: optional_argument(或者是2)時,參數輸入格式只能爲:參數=值

        flag:這個參數有兩個值,空或者非空。
        a:若是參數爲空NULL,那麼當選中某個長選項的時候,getopt_long將返回val值。eg,可執行程序 --help,getopt_long的返回值爲h.     
        b:若是參數不爲空,那麼當選中某個長選項的時候,getopt_long將返回0,而且將flag指針參數指向val值。
eg: 可執行程序 --http-proxy=127.0.0.1:80 那麼getopt_long返回值爲0,而且lopt值爲1。 val:表示指定函數找到該選項時的返回值,或者當flag非空時指定flag指向的數據的值val。 longindex:longindex非空,它指向的變量將記錄當前找到參數符合 longopts 裏的第幾個元素的描述,便是 longopts 的下標值。 返回值說明: (1)若是短選項找到,那麼將返回短選項對應的字符。 (2)若是長選項找到,若是flag爲NULL,返回val。若是flag不爲空,返回0 (3)若是遇到一個選項沒有在短字符、長字符裏面。或者在長字符裏面存在二義性的,返回'?' (4)若是解析完全部字符沒有找到(通常是輸入命令參數格式錯誤,eg: 連斜槓都沒有加的選項),返回'-1' (5)若是選項須要參數,忘了添加參數。返回值取決於optstring,若是其第一個字符是':',則返回':',不然返回'?' 注意 longopts 的最後一個元素必須是全0填充,不然會報段錯誤 短選項中每一個選項都是惟一的。而長選項若是簡寫,也須要保持惟一性。 C.全局變量說明 optarg:表示當前選項對應的參數值。 optind:表示的是下一個將被處理到的參數在argv中的下標值。 opterr:若是opterr = 0,在getopt、getopt_long、getopt_long_only遇到錯誤將不會輸出錯誤信息到標準輸出流。opterr在非0時,向屏幕輸出錯誤。 optopt:表示沒有被未標識的選項。
*/ int lopt = 0; static const struct option long_options[] = { { "daemon", no_argument, NULL, 'D' }, { "log", required_argument, NULL, 'l' }, { "http-proxy", required_argument, NULL, 'p' }, { "version", no_argument, NULL, 'V' }, { "help", no_argument, NULL, 'h' }, { 0, 0, 0, 0 } }; static void usage(void) { fprintf(stderr, "test [option]... URL\n" " -2 kill program .\n" " --daemon Use GET request daemon.\n" " --log Use Log option.\n" " -p|--http-proxy Use Http Proxy.\n" " -h|--help This information.\n" " -V|--version Display program version.\n" ); }; void show_version() { printf("====version[1.1.0]====\n"); } void show_help() { printf("i will help you, but i am not home now . ^_^ \n"); } void test(int argc, char **argv) { int opt = 0; int options_index = 0; if (1 == argc) { usage(); return; } while ((opt = getopt_long(argc, argv, "2Vhp:", long_options, &options_index)) != EOF) { //短選項處理 switch (opt) { case 0: break; case '2': printf(" i am right now exit .\n"); break; case 'V': show_version(); break; case 'l': printf(" i am open log option [%s].\n", optarg); break; case 'h': show_help(); break; case 'p': printf("http proxy is [%s] .\n", optarg); break; default: usage(); break; } } if (optind < argc) { usage(); printf("getopt_long() error !\n"); } } int main(int argc, char *argv[]) { test(argc, argv); return 0; }
相關文章
相關標籤/搜索