我对 Python 编码非常熟悉,但现在我必须在 C 中进行字符串解析。
我的输入:
输入=“command1 args1 args2 arg3;command2 args1 args2 args3;cmd3 arg1 arg2 arg3”
我的 Python 解决方案:
input = "command1 args1 args2 arg3;command2 args1 args2 args3;command3 arg1 arg2 arg3"
compl = input.split(";")
tmplist =[]
tmpdict = {}
for line in compl:
spl = line.split()
tmplist.append(spl)
for l in tmplist:
first, rest = l[0], l[1:]
tmpdict[first] = ' '.join(rest)
print tmpdict
#The Output:
#{'command1': 'args1 args2 arg3', 'command2': 'args1 args2 args3', 'cmd3': 'arg1 arg2 arg3'}
预期输出:以命令为键的字典,并将参数作为字符串连接到值中
到目前为止我的 C 解决方案:
我想将我的命令和参数保存在这样的结构中:
struct cmdr{
char* command;
char* args[19];
};
我创建了一个 struct char* 数组来保存由“;”分隔的 cmd + args:
结构 ari { char* value[200];};
功能:
struct ari inputParser(char* string){
char delimiter[] = ";";
char *ptrsemi;
int i = 0;
struct ari sepcmds;
ptrsemi = strtok(string, delimiter);
while(ptrsemi != NULL) {
sepcmds.value[i] = ptrsemi;
ptrsemi = strtok(NULL, delimiter);
i++;
}
return sepcmds;
- 按空格分隔命令和数组并将它们保存在我的结构中:
首先我添加了一个帮助结构:
struct arraycmd {
struct cmdr lol[10];
};
struct arraycmd parseargs (struct ari z){
struct arraycmd result;
char * pch;
int i;
int j = 0;
for (i=0; i < 200;i++){
j = 0;
if (z.value[i] == NULL){
break;
}
pch = strtok(z.value[i]," ");
while(pch != NULL) {
if (j == 0){
result.lol[i].command = pch;
pch = strtok(NULL, " ");
j++;
} else {
result.lol[i].args[j]= pch;
pch = strtok(NULL, " ");
j++;
}
}
pch = strtok(NULL, " ");
}
return result;
我的输出函数如下所示:
void output(struct arraycmd b){
int i;
int j;
for(i=0; i<200;i++){
if (b.lol[i].command != NULL){
printf("Command %d: %s",i,b.lol[i].command);
}
for (j = 0; j < 200;j++){
if (b.lol[i].args[j] != NULL){
printf(" Arg %d = %s",j,b.lol[i].args[j]);
}
}
printf(" \n");
}
}
但它只产生垃圾(与我的python解决方案中的输入相同):(
command1 args1 args2 arg3;command2 args1 args2 args3;command3 arg1 arg2 arg3)
命令 0:command1 Arg 0 = command2 Arg 1 = args1 Arg 2 = args2 Arg 3 = arg3 Arg 19 = command2 Arg 21 = args1 Arg 22 = args2 Arg 23 = args3 Arg 39 = command3 Arg 41 = arg1 Arg 42 = arg2 Arg 43 = arg3 分段错误
所以我希望有人可以帮助我解决这个问题。