[英]Linux C: Shell-like environment - for individual execution - of C commands? (C interpreter)
[英]Parsing commands shell-like in C
我想在我的C(只是C)程序中解析用户输入命令。 示例命令:
add node ID
add arc ID from ID to ID
print
exit
等等。 然后我想用ID做一些验证并将它们转发到指定的函数。 功能和验证当然是准备好的。 这都是关于解析和匹配函数的...
我和许多做它if
S和strtok
S,但我敢肯定,这不是最好的办法...任何想法(库)?
我想你想要的是这样的:
while (1)
{
char *line = malloc(128); // we need to be able to increase the pointer
char *origLine = line;
fgets(line, 128, stdin);
char command[20];
sscanf(line, "%20s ", command);
line = strchr(line, ' ');
printf("The Command is: %s\n", command);
unsigned argumentsCount = 0;
char **arguments = malloc(sizeof(char *));
while (1)
{
char arg[20];
if (line && (sscanf(++line, "%20s", arg) == 1))
{
arguments[argumentsCount] = malloc(sizeof(char) * 20);
strncpy(arguments[argumentsCount], arg, 20);
argumentsCount++;
arguments = realloc(arguments, sizeof(char *) * argumentsCount + 1);
line = strchr(line, ' ');
}
else {
break;
}
}
for (int i = 0; i < argumentsCount; i++) {
printf("Argument %i is: %s\n", i, arguments[i]);
}
for (int i = 0; i < argumentsCount; i++) {
free(arguments[i]);
}
free(arguments);
free(origLine);
}
在你释放它之前,你可以用'命令'和'参数'做你想做的事。
这取决于您的命令语言有多复杂。 如果你有多个命令,或者如果每个命令可以采用多种形式,例如你的add
命令,那么编写一个简单的递归下降解析器 可能是值得的。
我过去曾为一些项目手工完成了几个RDP。 这有点工作,但是它允许你处理一些相当复杂的命令,否则这些命令不会直接解析。 您也可以使用像lex / yacc或flex / bison这样的解析器生成器,尽管这可能对您正在做的事情有些过分。
否则,它基本上就是你所描述的; strok
和一堆嵌套的if
语句。
我只想在Richard Ross的回复中添加一些内容:检查malloc和realloc的返回值。 这可能会导致程序中难以发现的崩溃。
所有命令行参数都将存储到char数组* argv中。您可以使用argv [0],argv [1] ... argv [n]访问这些值。希望这对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.