我用C语言编写了我自己的libreadline Linux库。在readline()中,它从shell中获取代码行,并用空格字符进行解析,然后将其存储到一个指针变量中。现在,我希望解析这些行来获取命令行参数,这些参数包含命令和执行命令的文件名。
在这里,我遇到了一个问题,如果文件名有空格的名称,它会像下面这样解析
myshell$ ls 'file name 1' 'file name 2' file\ name\ 3上面的cli是这样解析的
ls
'file
name
1'
'file
name
2'
file\
name\
3所以,请帮助我解决这个问题,从读取行中获取空格文件名。
下面是我称之为readline的代码片段。
while (!done)
{
temp = readline (prompt);
/* Test for EOF. */
if (!temp)
exit (1);
/* If there is anything on the line, print it and remember it. */
if (*temp)
{
add_history (temp);
}
<Other stuffs to execute the command>
}使用tokeniser更新了文章。
ptr = strtok(temp, " ");
while(ptr != NULL) {
printf("%s\n", ptr);
ptr = strtok(NULL, " ");
}发布于 2020-09-02 19:03:43
即使是这种复杂程度的标记化,也很难使用strtok()的简单应用来实现。即使你能让它工作,代码也是不可读和不可维护的。有一些工具(如flex)可以根据规范生成记号赋予器,您也可以使用有限状态机(FSM)自己编写逻辑代码。使用FSM,您将检查每个字符,并根据标记器的当前状态采取操作。某些状态/字符组合将导致状态更改。
例如,如果您处于“双引号”状态,则不会将空格视为标记的末尾。但是,双引号状态中的双引号字符将发出从该状态转换到其他状态的信号。它们之间的状态和字符类别形成了一种矩阵,其中的条目控制在遇到状态和字符类别的每个组合时采取什么操作。
FWIW我有一个简单的实现,可以按照您想要的行来解析ASCII文本;请参阅以下代码中的tokenize()函数:
https://github.com/kevinboone/xine-server/blob/master/client/src/string.c
如果您正在创建一个shell,请注意“真正的”shell中的标记化逻辑非常复杂,并且通常使用工具实现。此外,大多数现代的真实应用程序都需要宽字符支持,这又增加了一层复杂性。
https://stackoverflow.com/questions/63698034
复制相似问题