vin*_*e88 1 c delimiter strtok
我正在编写一个简单的shell,它接受一些标准命令,比如C中的cd和ls.我正在尝试实现一个用户可以输入";"的功能.在命令之间,以便可以在同一行上写入一堆命令并单独执行.因此,如果我输入"cd Desktop; ls",shell应该cd到Desktop并打印目录中的内容.问题是它只执行第一个命令.这是我的主要方法:
char input[1024];
while(1)
{
printf("%s ", prompt);
fgets(input, 1024, stdin);
char delims[] = ";";
char *result = NULL;
result = strtok( input, delims );
while( result != NULL )
{
printf("%s\n", result);
char * copy = malloc(strlen(result) + 1); //Create a copy of the input token
strcpy(copy, result);
format(copy);
if(programs)
{
handle();
cleanup(programs);
programs = NULL;
}
free(copy);
result = strtok( NULL, delims );
cmdno++;
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我尝试将输入分解为基于";"的标记.然后将令牌提供给format()方法,如下所示:
int format(char input[])
{
input = strtok(input, "\n");
...
}
Run Code Online (Sandbox Code Playgroud)
我知道strtok会对原始字符串进行更改,这就是为什么我在将令牌传递给格式之前先创建令牌的副本.我正在做的正确吗?
你不能混合多个strtok电话.这是发生了什么:
input所以strtok注意并在内部存储东西input
copy所以再次strtok注意,从而破坏以前的信息strtok只知道copy业务,对原始内容一无所知input.主要问题是,strtok不知道你在同一时间做两件事.从它的角度来看,你只需在完成第一个字符串之前就开始处理不同的字符串.
可能的解决方案:
strtok_r如果你有它,请使用.它不是标准的C(但它是标准的POSIX).r折旧的立场copy在完成之前不需要拆分input关于最后一点:
char *并填充它strtok而不暂停分割子标记.所以每个元素应该是不同的命令";"拆分后,开始处理每个数组元素