我正在为我开发的类似bash的shell编写一个选项解析器.
然而,为了与bash选项兼容,我必须阅读一些以'+'开头的选项,如下所示:
./42sh +O autocd [...]
(手册页说这些选项将传递给内置shopt,它设置设置的值).
问题是,getopt_long()函数仅返回与一开始的选项-或者--,如果他们并不孤单.如果是,则bash将它们分别作为标准输入的别名和选项标记的结尾.
我怎么能得到这种类型的选择getopt_long()?我自己要解析这些选项吗?
编辑:根据@jxh响应和man 3 getopt页面,我发现getopt并getopt_long安排**argv参数数组移动所有看起来不是有效选项的参数 - 从他们的角度来看 - 最后.所以,我在通常的代码之后编写了以下代码,获得了正常的选项(所有建议和评论都非常感激):
EDIT2:由于在循环的每次迭代中使用strdup()而导致内存泄漏.
for(; optind < argc; ++optind)
{
const char *argv_copy = strdup(argv[optind]);
if (argv_copy[0] == '+' && argv_copy[1] == 'O')
{
/* A deactivation parameter have been just found ! */
if (handle_shopt_options(shell_options,
argv[optind + 1],
DISABLE) == EXIT_FAILURE)
{
usage(argv[optind]);
free_shell_options(shell_options);
shell_options = …Run Code Online (Sandbox Code Playgroud) 我正在从书中学习 Rust ,我刚刚完成第一个练习,猜谜游戏。
我用来cargo构建和运行我的小箱子。
$ cargo --version
cargo 1.37.0 (9edd08916 2019-08-02)
$ rustc --version
rustc 1.37.0 (eae3437df 2019-08-13)
Run Code Online (Sandbox Code Playgroud)
一切都运行良好,包括release模式。尽管如此,我不理解 Rust 的以下行为:我必须在循环的每次迭代中重新声明包含用户输入的变量。
由于练习是逐步指导的,因此我的代码与书中的代码相同。尽管如此,书中的代码如下:
loop {
// Some code to display instructions.
// Reallocate a new string at each iteration!
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
// Some code to check if the player found …Run Code Online (Sandbox Code Playgroud)