总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
-
解析命令行
-
设置默认值
-
错误处理
-
显示选项语法及帮助
-
打扫干净
-
完整的使用Argtable3的流程图
-
相关链接
=============================================================================================
Argtable是一款开源的ANSI C library,用来解析GNU样式的命令行选项。它通过定义可用于指定命令行语法的声明式API,从而简化了命令行的分析。
argtable将自动生成一致的错误处理逻辑和命令行语法的文本描述,这对于一个健壮的cli程序来说,是非常必要的,但是很繁琐。
解析程序的命令行一直以来都是一个分散注意力的主要编程任务。Argtable3 库通过允许程序员将源代码中的命令行选项直接定义为静态的结构数组来简化作业, 然后**
将该数组传递给argtable3库函数,这些函数就会相应地解析命令行。从命令行中提取的值直接保存到用户定义的程序变量中**,主程序就可以访问这些变量。
argtable3还可以从同一数组中生成命令行语法的描述,以便显示为联机帮助。根据第三条BSD许可条款,此库是免费的。 注意:argtable3不向后兼容。
demo code
- 入门小例子
// 引入 argtable3
#include “argtable3.h”
/* global arg_xxx structs */
struct arg_lit *help;
struct arg_end *end;
int main(int argc, char *argv[]) {
/* the global arg_xxx structs are initialised within the argtable */
void *argtable[] = {
help = arg_litn(NULL, “help”, 0, 1, “display this help and exit”),
end = arg_end(20)
};
int exitcode = 0;
char program[] = “argtable”;
arg_parse(argc, argv, argtable);
/* special case: ‘–help’ takes precedence over error reporting */
if (help->count > 0) {
printf(“Usage: %s”, program);
arg_print_syntax(stdout, argtable, “\n”);
printf(“Demonstrate command-line parsing in argtable3.\n\n”);
arg_print_glossary(stdout, argtable, " %-25s %s\n");
exitcode = 0;
/* deallocate each non-null entry in argtable[] */
arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0]));
}
return exitcode;
}
- 运行
./argtable --help
输出
Usage: argtable [–help]
Demonstrate command-line parsing in argtable3.
–help display this help and exit
how it works
Argtable3 提供了一组arg_xxx结构,一个用于它支持的每种类型的参数(文字、整数、双精度、字符串、文件名等),
并且每个结构都能够在命令行上处理该参数的多次出现。此外,可以为每个选项提供可互换使用的替代短选项 (-x)或长选项 (–xx) 形式。
事实上,每个选项甚至可以选择多个替代的短选项或长选项,或两者兼而有之。
要定义命令行选项,您必须为arg_xxx所需的每种类型的参数(文字、整数、双精度、字符串、文件名等)创建一个结构体,并将它们整理到我们称为参数表(argument table)的数组中。
参数表中结构的顺序定义了命令行选项的预期顺序,不过解析顺序实际上只对未标记的选项重要(和python的函数传参规则类似)。
参数表本身只是一个void指针数组(void* arg_table[]
),
按照惯例,每个arg_xxx结构都有一个已知的arg_hdr结构体作为其第一个条目,Argtable3 函数使用它来标识结构体。
arg_hdr
typedef struct arg_hdr {
char flag; /* Modifier flags: ARG_TERMINATOR, ARG_HASVALUE. */
const char* shortopts; /* String defining the short options */
const char* longopts; /* String defiing the long options */
const char* datatype; /* Description of the argument data type */
const char* glossary; /* Description of the option as shown by arg_print_glossary function */
int mincount; /* Minimum number of occurences of this option accepted */
int maxcount; /* Maximum number of occurences if this option accepted */
void* parent; /* Pointer to parent arg_xxx struct */
arg_resetfn* resetfn; /* Pointer to parent arg_xxx reset function */
arg_scanfn* scanfn; /* Pointer to parent arg_xxx scan function */
arg_checkfn* checkfn; /* Pointer to parent arg_xxx check function */
arg_errorfn* errorfn; /* Pointer to parent arg_xxx error function */
void* priv; /* Pointer to private header data for use by arg_xxx functions */
} arg_hdr_t;
最基本的一个类型,所有的其他类型都包含这个类型。一一解释下里面的参数的含义:
-
shortopts: 参数的短名称,比如ls -a 中的a就是短名称;
-
longopts: 参数中的长名称,比如ls —all 中的all就是长名称;
-
datatype: 参数的数据类型有, , NULL, ,(时间类型传入format字符串),(rex类型传入匹配串),等;
-
glossary: 对于参数的描述;
-
mincount: 参数最少的个数(可以规定是否必须有参数比如设置为0为非必须,1…n为必须);
-
maxcount: 参数最多的个数,采用Unix风格的,如kernel.exe -l 1 -l 2 -l 3
-
其他参数非必须。
arg_xxx结构体族
// 整数
struct arg_int
{
struct arg_hdr hdr;
int count;
int *ival;
};
// 文字
struct arg_lit
{
struct arg_hdr hdr;
int count;
};
// 双精度浮点数
struct arg_dbl
{
struct arg_hdr hdr;
int count;
double *dval;
};
// 字符串
struct arg_str
{
struct arg_hdr hdr;
int count;
const char **sval;
};
struct arg_rex
{
struct arg_hdr hdr;
int count;
const char **sval;
};
struct arg_file
{
struct arg_hdr hdr;
int count;
const char **filename;
const char **basename;
const char **extension;
};
struct arg_date
{
struct arg_hdr hdr;
const char *format;
int count;
struct tm *tm_val;
};
详细介绍 arg_int
struct arg_int
{
struct arg_hdr hdr;
int count;
int *ival;
};
结构体的第一个数据成员hdr保存了 Argtable3 库函数使用的私有数据。它包含参数的标签字符串等内容(可以理解为元数据)。
直接公开地访问这些数据是可以的,但很少需要这样做。
它的ival成员变量指向持有从命令行提取出的数组,count为数组的长度。ival 数组的存储在arg_int构造时分配。
这必须通过arg_int构造函数完成。
注意,你永远不应该自己手动实例化任何arg_xxx结构,而是始终使用提供的构造函数来分配结构,并在完成后使用 arg_freetable 释放它。
- 举例
struct arg_int *s;
s = arg_intn(NULL, “scalar”, “”, 3, 5, “foo value”);
完成s后将指向一个包含5 个元素数组的内存块的结构体arg_int。
甚至,你还可以设置多个别名,短选项被赋予一串单个字符,而长选项被赋予一个逗号分隔的字符串。
例如:s = arg_intn("kKx", "scalar,foo", "<n>", 3, 5, "foo value");
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vo3FZ9oz-1633800152784)(example.png)]
如图所示,该s->hdr
结构保留对构造函数的字符串参数的引用等。
该s->count
变量初始化为零,因为它表示s->ival
解析命令行后存储在数组中的有效值的数量。
s->ival
数组的大小由s->hdr.maxcount
给出。
- 实例代码
// 引入 argtable3
#include “argtable3.h”
/* global arg_xxx structs */
struct arg_int *int_arrays;
struct arg_end *end;
int main(int argc, char *argv[]) {
/* the global arg_xxx structs are initialised within the argtable */
void *argtable[] = {
int_arrays = arg_intn(“a”, “array”, “”, 2, 3, “please input an integer”),
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
[外链图片转存中…(img-TDROzBdA-1715532505024)]