用C语言中的strtok解析输入
我有一个类中的项目,需要我用C构建一个简单的shell。我是C新手,现在面临的问题是在发送命令执行之前正确解析命令。我知道有几种不同的方法可以做到这一点,但我们需要使用strtok,我似乎有一些问题 以下是我的全部代码:用C语言中的strtok解析输入,c,parsing,strtok,execvp,C,Parsing,Strtok,Execvp,我有一个类中的项目,需要我用C构建一个简单的shell。我是C新手,现在面临的问题是在发送命令执行之前正确解析命令。我知道有几种不同的方法可以做到这一点,但我们需要使用strtok,我似乎有一些问题 以下是我的全部代码: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> int parseCommands(char *command,
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
int parseCommands(char *command, char **args){
int pos = 0;
printf("%s\n", command);
char *readCommand = NULL;
char delims[] = {" \n"};
readCommand = strtok(command, delims);
while(readCommand != '\0'){
printf("%s\n", readCommand);
strcpy(args[pos], readCommand);
printf("%s\n", args[pos]);
readCommand = strtok(NULL, delims);
pos++;
}
return pos;
}
int executeCommand(char **args){
pid_t pID;
switch(pID = fork()){
case 0:
execvp(args[0], args);
perror("Some sort of exec error");
return -1;
case -1:
perror("Could not even fork");
return -2;
default:
wait(NULL);
return 0;
}
}
void main(){
char wd[256];
char input[256];
char *args[15];
char strDelims[] = ";";
char *readInput = NULL;
while(1){
getcwd(wd, sizeof wd);
printf("mysh: %s> ", wd);
fgets(input, sizeof input, stdin);
readInput = strtok(input, strDelims);
int numArgs;
numArgs = parseCommands(readInput, args);
if(numArgs < 1)
printf("There was a problem parsing the command\n");
if(strcmp(args[0], "cd") == 0){
printf("%d\n", numArgs);
if(numArgs > 1){
if((chdir(args[1])) < 0){
perror("I'm afraid I can't let you do that Dave\n");
}
}
else{
if((chdir(getenv("HOME"))) < 0){
perror("Can't go home\n");
}
}
}
else if(strcmp(readInput, "quit") == 0){
break;
}
else{
if((executeCommand(args)) != 0)
printf("Problem executing the command\n");
}
readInput = strtok(input, strDelims);
}
}
我只是觉得奇怪的是,cd
似乎工作得相当好,但它实际上并不喜欢其他任何东西。这让我觉得以后(但在numArgs的printf之前?)会出问题。仅供参考,我们被告知每个命令不能超过15个参数或256个字符
这已经让我沮丧了一段时间,所以对这个特定问题的任何帮助都将是非常棒的(我意识到其中还有其他错误或糟糕的代码部分,但我想自己解决这些问题)。非常感谢!:) 一些指针
通常strtok共享一个静态缓冲区,所以当您先调用strtok之后
你的解析函数,然后在后面的解析函数中,你可能会搞砸
之前缓冲区里有什么
您也不为args[]分配空间,只声明一个指针数组(char*args[15])
但是,在解析函数中,对指针指向的对象进行strcpy。
您需要分配一个缓冲区,分配给args[i],然后将字符串复制到其中
所以不是
strcpy(args[pos], readCommand);
做
家庭作业标签已弃用。请不要用它。
strcpy(args[pos], readCommand);
args[pos] = strdup(readCommand);