/* 獲取字符編碼 */ #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; }