将命令行语句解析为令牌列表 [英] Parsing command line statements as a list of tokens
本文介绍了将命令行语句解析为令牌列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
#include <stdio.h>
#include <string.h> /* needed for strtok */
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv) {
char text[10000];
fgets(text, sizeof(text), stdin);
char *t;
int i;
t = strtok(text, "\"\'| ");
for (i=0; t != NULL; i++) {
printf("token %d is \"%s\"\n", i, t);
t = strtok(NULL, "\"\'| ");
}
}
这是我试图使其分离标记的代码的一部分
This is part of the code that im trying to make it is supposed to separate tokens
假设输入为'abc' "de f'g" hij| k "lm | no"
输出应为
token 1: "abc"
token 2: "de f'g"
token 3: "hij"
token 4: "|"
token 5: "k"
token 6: "lm | no"
我得到了一些不同的东西,但是无论如何我都可以将其更改为这种格式?
I get something different but close anyway I can change it to this format?
推荐答案
#include <stdio.h>
#include <string.h>
char *getToken(char **sp){
static const char *sep = " \t\n";
static char vb[] = "|", vbf;
char *p, *s;
if(vbf){
vbf = 0;
return vb;
}
if (sp == NULL || *sp == NULL || **sp == '\0') return(NULL);
s = *sp;
if(*s == '"')
p = strchr(++s, '"');
else if(*s == '\'')
p = strchr(++s, '\'');
else
p = s + strcspn(s, "| \t\n");
if(*p != '\0'){
if(*p == '|'){
*vb = vbf = '|';
}
*p++ = '\0';
p += strspn(p, sep);
}
*sp = p;
if(!*s){
vbf = 0;
return vb;
}
return s;
}
int main(int argc, char **argv) {
char text[10000];
fgets(text, sizeof(text), stdin);
char *t, *p = text;
int i;
t = getToken(&p);
for (i=1; t != NULL; i++) {
printf("token %d is \"%s\"\n", i, t);
t = getToken(&p);
}
return 0;
}
这篇关于将命令行语句解析为令牌列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文