【发布时间】: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)相同,但使用辅助函数,如strchr、strspn和strpbrk。(3) 类似,但使用strtok或strsep,如 Werner 的回答中所述。(4) 使用 lex。
标签: c shell command scanf alias