Linux下传参函数getopt使用

tech2025-04-16  1

int getopt(int argc, char* const argv[ ], const char *optstring ); 功能: 解析命令行参数, 参数: argc和argv分别代表参数个数和内容,跟main()函数里的命令行参数一样 optstring: 为选项字符串,告知getopt可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号:“:”,则表示还有相关的参数,全域变量optarg即会指向此额外参数,如果在处理期间遇到了不符合optstring指定的其他选项,getopt()将会显示一个错误消息,并将全局域变量设置为“?”字符,将全局域变量opterr设置为0则将不会打印出错信息。 extern char* optarg; extern int optind, opterr, optopt; 参数optarg:指向当前选项参数的指针 参数optind:再次调用getopt时的下一个argv指针索引 参数optopt:表示最后一个未知选项 参数optstring: 比如getopt(argc, argv, "td:ch:q::") 1. 单个字符,表示选项,这里一共有t、d、c、h、q五个选项 2. 单个字符后接一个冒号“:”表示该选项后必须跟一个参数,参数紧跟在选项后或者以空格隔开 3. 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟,如果后边跟一个参数,参数必须紧跟在选项后不能以空格隔开

测试代码

#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAX_BUFF_SIZE (1024) /* ./show_file [-s Size] [-f freetype_font_file] [-h HZK] <text_file> */ int main(int argc, char *argv[]) { int iError = -1; unsigned int dwFontSize = 16; char acHzkFile[MAX_BUFF_SIZE] = { 0 }; char acFreetypeFile[MAX_BUFF_SIZE] = { 0 }; char acTextFile[MAX_BUFF_SIZE] = { 0 }; char cOpr = 0; acHzkFile[0] = '\0'; acFreetypeFile[0] = '\0'; acTextFile[0] = '\0'; if(argc < 2) { fprintf(stderr, "Usage: \n"); fprintf(stderr, "%s [-s Size] [-f freetype_font_file] [-h HZK] <text_file>\n", argv[0]); return -1; } while ((iError = getopt(argc, argv, "s:f:h:")) != -1) { switch(iError) { case 's': { dwFontSize = strtoul(optarg, NULL, 0); break; } case 'f': { strncpy(acFreetypeFile, optarg, MAX_BUFF_SIZE); acFreetypeFile[MAX_BUFF_SIZE-1] = '\0'; break; } case 'h': { strncpy(acHzkFile, optarg, MAX_BUFF_SIZE); acHzkFile[MAX_BUFF_SIZE-1] = '\0'; break; } default: { printf("Usage: %s [-s Size] [-f font_file] [-h HZK] <text_file>\n", argv[0]); return -1; break; } } } strncpy(acTextFile, argv[optind], MAX_BUFF_SIZE); acTextFile[MAX_BUFF_SIZE-1] = '\0'; printf("dwFontSzie=%d, acHzkFile=%s, acFreetypeFile=%s, acTextFile=%s\n", dwFontSize, acHzkFile, acFreetypeFile, acTextFile); return 0; }

测试结果

最新回复(0)