小编Fra*_*hal的帖子

如何获得以"+"字符开头的选项的值?

我正在为我开发的类似bash的shell编写一个选项解析器.

然而,为了与bash选项兼容,我必须阅读一些以'+'开头的选项,如下所示:

./42sh +O autocd [...]

(手册页说这些选项将传递给内置shopt,它设置设置的值).

问题是,getopt_long()函数仅返回与一开始的选项-或者--,如果他们并不孤单.如果是,则bash将它们分别作为标准输入的别名和选项标记的结尾.

我怎么能得到这种类型的选择getopt_long()?我自己要解析这些选项吗?

编辑:根据@jxh响应和man 3 getopt页面,我发现getoptgetopt_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)

c bash c99 getopt getopt-long

4
推荐指数
1
解决办法
100
查看次数

为什么需要在循环的每次迭代中声明一个变量才能使用它?

我正在从书中学习 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)

rust

2
推荐指数
1
解决办法
686
查看次数

标签 统计

bash ×1

c ×1

c99 ×1

getopt ×1

getopt-long ×1

rust ×1