是否可以在 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)相同,但使用辅助函数,如strchr
、strspn
和 strpbrk
。(3) 类似,但使用 strtok
或 strsep
,如 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 中创建别名命令?的主要内容,如果未能解决你的问题,请参考以下文章