我想在我的C(只是C)程序中解析用户输入命令。示例命令:
add node ID add arc ID from ID to ID print exit
等等。然后我想用ID做一些验证,并将它们转发给指定的函数。函数和验证当然已经准备好了。这都是关于解析和匹配函数的...我用了很多if和strtok,但我肯定这不是最好的方法...有什么想法吗?
if
strtok
s4chpxco1#
我想你想要的是这样的:
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); }
你可以做你想与'命令'和'参数'只是在你释放它之前。
yduiuuwa2#
这取决于你的命令语言有多复杂。如果你有几个以上的命令,或者每个命令都可以有多种形式,比如你的add命令,那么你可能需要花点时间编写一个简单的recursive descent parser。过去我曾为一些项目手工编写过几个RDPs。这是一项工作,但它允许你处理一些相当复杂的命令,否则解析起来就不那么简单了。你也可以使用像lex/yacc或flex/野牛这样的解析器生成器,尽管这对你正在做的事情来说可能有点过头了。否则,基本上就是你所描述的那样;strok和一堆嵌套的if语句。
add
strok
sulc1iza3#
我想补充一下理查德·罗斯的回答:检查malloc和realloc的返回值。这可能会导致程序中难以找到的崩溃。
kgsdhlau4#
所有命令行参数都将存储在一个名为argv的字符串数组中。您可以使用argv[0]、argv[1] ... argv[n]访问这些值。
argv
argv[0]
argv[1]
argv[n]
4条答案
按热度按时间s4chpxco1#
我想你想要的是这样的:
你可以做你想与'命令'和'参数'只是在你释放它之前。
yduiuuwa2#
这取决于你的命令语言有多复杂。如果你有几个以上的命令,或者每个命令都可以有多种形式,比如你的
add
命令,那么你可能需要花点时间编写一个简单的recursive descent parser。过去我曾为一些项目手工编写过几个RDPs。这是一项工作,但它允许你处理一些相当复杂的命令,否则解析起来就不那么简单了。你也可以使用像lex/yacc或flex/野牛这样的解析器生成器,尽管这对你正在做的事情来说可能有点过头了。
否则,基本上就是你所描述的那样;
strok
和一堆嵌套的if
语句。sulc1iza3#
我想补充一下理查德·罗斯的回答:检查malloc和realloc的返回值。这可能会导致程序中难以找到的崩溃。
kgsdhlau4#
所有命令行参数都将存储在一个名为
argv
的字符串数组中。您可以使用
argv[0]
、argv[1]
...argv[n]
访问这些值。