是否可以在 C 中使用 sscanf 在 shell 中创建别名命令?

Posted

技术标签:

【中文标题】是否可以在 C 中使用 sscanf 在 shell 中创建别名命令?【英文标题】:Is it possible to use sscanf in C to create the alias command in a shell? 【发布时间】:2018-09-03 06:24:24 【问题描述】:

我目前正在尝试用 C 创建一个模仿特定 Unix 命令的 shell。现在我正在尝试使用 sscanf() 创建别名命令,但我一直在尝试让它工作时遇到问题。由于这些问题,我开始怀疑是否可以使用此函数来创建别名命令。

char *str=malloc(5000);
/*
...
*/


 /*Function to alias commands*/
    int aliasing(char *str)
    
            char *new_name=malloc(5000);
            char *alias_val=malloc(5000);

            sscanf(str,"alias %s=\"%s\"", new_name, alias_val);
    

为避免发布大部分 main() 代码,我使用“...”将其删除。我对 sscanf() 的理解是它从 shell 中的用户那里获取输入 str (假设他们输入了 alias (something)="(unix command)"),然后将第一个 %s 分配给 new_name,第二个 % s 到 alias_val。但是,在 alias 和 alias_val 没有得到任何东西之后,new_name 被分配了整个字符串。

这让我怀疑是否可以以这种方式使用 sscanf(),这将我带到了这里。任何形式的反馈或解决问题的想法将不胜感激。另外,如果不能使用 sscanf() 是否有替代方法来实现 alias 命令?

【问题讨论】:

sscanf 的解析器很简单。 %s 将所有内容读取到一个空格内,因此它会很高兴地吞噬 =。你可以试试%[^=] 我试过了,由于某种原因,它仍然会读取“=”并进入引号。 再试一次。我做到了,它对我有用。 (尽管您仍然会遇到这些引号的问题。) 不过,在回答您的问题时,是的,还有其他方法可以解析这样的字符串; sscanf 不是唯一的方法。事实上,正如我们刚刚看到的,sscanf 甚至不是解决这个问题的好方法;还有其他更好。 回答“什么是更好的方法?”这个问题:(1) 沿着字符串移动 char * 指针,寻找 '=' 和 '"" 字符。找到它们时指向字符串中有趣点的指针。将字符串复制到单独的 char [] 数组中,或者在行内插入 '\0' 字符以隔离它们。(2)相同,但使用辅助函数,如strchrstrspnstrpbrk。(3) 类似,但使用 strtokstrsep,如 Werner 的回答中所述。(4) 使用 lex。 【参考方案1】:

你可以用 strtok 代替

char delimiter[] = " =\"";
char *ptr;
ptr = strtok(str, delimiter); 
for(i = 0; ptr != NULL; i++) 

    printf("token %d: found '%s'\n", i, ptr);
    if(i == 1)
        strcpy(new_name, ptr);
    if(i == 2)
        strcpy(alias_val, ptr);
    ptr = strtok(NULL, delimiter);     

然后你会得到三个令牌:别名、new_name 和 alias_val

【讨论】:

你能帮我理解获得这三个令牌将如何帮助我创建别名命令吗?我只是不明白拥有这三个令牌有什么帮助。我会使用 strtok 和 sscanf 的组合吗? 更新了例子,strcpy可以用来取出结果token。

以上是关于是否可以在 C 中使用 sscanf 在 shell 中创建别名命令?的主要内容,如果未能解决你的问题,请参考以下文章

C++里sscanf()与swscanf()的使用

C++里sscanf()与swscanf()的使用

sscanf使用小记

c函数sscanf的高级技巧

sscanf 与 sscanf_s的区别

对 __isoc99_sscanf 的未定义引用