Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么chdir()不成功?_C_String_Chdir - Fatal编程技术网

为什么chdir()不成功?

为什么chdir()不成功?,c,string,chdir,C,String,Chdir,我正在编写一个基本的shell,我的第一个要求是测试cd,我有可能的cd命令的所有条件,之后,我将处理像ls这样的命令。至于现在,我真的对一段代码感到困惑 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #define MAX_TOK 50 #define MAX_LEN 100 #define BUFSIZE 81 i

我正在编写一个基本的shell,我的第一个要求是测试cd,我有可能的cd命令的所有条件,之后,我将处理像ls这样的命令。至于现在,我真的对一段代码感到困惑

 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>

 #define MAX_TOK 50
 #define MAX_LEN 100
 #define BUFSIZE 81

 int tokenize(char *cmd, char tokens[MAX_TOK][MAX_LEN]){
     char *token;
     int NUM_TOKENS = 0;
     //printf("Splitting the string \"%s\" into tokens:\n",cmd);
     token = strtok(cmd, " ");

    while(token != NULL){
         strcpy(tokens[NUM_TOKENS],token);
         token = strtok(NULL, " ");
         NUM_TOKENS++;
     }
      return NUM_TOKENS;
  }

void decide(char tokens[MAX_TOK][MAX_LEN], int NUM_TOKENS){

    char *home = getenv("HOME");
    int success;
    char *cd = {"cd"};
    char *string = tokens[1];
    //printf("Number of tokens %d\n", NUM_TOKENS);
    //printf("%d\n",strcmp(tokens[0], cd));

    if(strcmp(tokens[0], cd) == 0){
        if(NUM_TOKENS > 2){
            printf("error: Too many arguments\n");
        }
        else{
           printf("Changing to new directory %s \n",tokens[1]);
           char *string = tokens[0];
           //printf("%s\n", tokens[1]);
           success = chdir(tokens[1]);
           printf("%d\n",success);
        }
    }
    else{
        printf("Completing the %s request\n",tokens[0]);
        take_action(tokens[0]);
    } 
 }

void take_action(char *cmd){
     printf("%s\n",cmd);
     int len;
     int return_code;
     char buffer[BUFSIZE];
     int pid;
     pid = fork();
     if(pid != 0){
         //parent process executing
         wait(NULL);
     }else{
         //child process executing
         len = strlen(buffer);
         if(buffer[len-1] == '\n'){
         buffer[len-1] = '\0';
       }
    return_code = execlp(cmd, cmd, NULL);
    if(return_code != 0){
        printf("Error executing %s.\n", cmd);
    }
   }//end else
}

int main(){
char *cmd;
char tokens[MAX_TOK][MAX_LEN];
int len;
int return_code;
char buffer[BUFSIZE];
int pid;

while(cmd != NULL){
    printf("Enter a command\n");
    cmd = fgets(buffer, BUFSIZE, stdin);
    // find the command
    int NUM_TOKENS = tokenize(cmd, tokens);
    //print_tokens(NUM_TOKENS, tokens);
    decide(tokens,NUM_TOKENS);
}



}//end main
#包括
#包括
#包括
#包括
#定义最大扭矩50
#定义最大长度100
#定义BUFSIZE 81
int-tokenize(char*cmd,char-tokens[MAX\u-TOK][MAX\u-LEN]){
字符*令牌;
int NUM_令牌=0;
//printf(“将字符串\%s\”拆分为标记:\n”,cmd);
令牌=strtok(cmd,“”);
while(令牌!=NULL){
strcpy(令牌[NUM_令牌],令牌);
令牌=strtok(空,“”);
NUM_标记++;
}
返回NUM_令牌;
}
无效决定(字符令牌[MAX_TOK][MAX_LEN],整数令牌){
char*home=getenv(“home”);
成功;
char*cd={“cd”};
char*string=tokens[1];
//printf(“令牌数%d\n”,NUM\u令牌);
//printf(“%d\n”,strcmp(令牌[0],cd));
if(strcmp(令牌[0],cd)==0){
如果(令牌数>2){
printf(“错误:参数太多\n”);
}
否则{
printf(“更改到新目录%s\n”,标记[1]);
char*string=tokens[0];
//printf(“%s\n”,标记[1]);
success=chdir(令牌[1]);
printf(“%d\n”,成功);
}
}
否则{
printf(“完成%s请求\n”,令牌[0]);
采取行动(令牌[0]);
} 
}
无效采取行动(char*cmd){
printf(“%s\n”,cmd);
内伦;
int返回_码;
字符缓冲区[BUFSIZE];
int-pid;
pid=fork();
如果(pid!=0){
//父进程正在执行
等待(空);
}否则{
//子进程执行
len=strlen(缓冲器);
如果(缓冲区[len-1]='\n'){
缓冲区[len-1]='\0';
}
return_code=execlp(cmd,cmd,NULL);
如果(返回_代码!=0){
printf(“执行%s时出错。\n”,cmd);
}
}//结束其他
}
int main(){
char*cmd;
char代币[MAX_TOK][MAX_LEN];
内伦;
int返回_码;
字符缓冲区[BUFSIZE];
int-pid;
while(cmd!=NULL){
printf(“输入命令”);
cmd=fgets(缓冲区、BUFSIZE、标准输入);
//查找命令
int NUM_TOKENS=tokenize(cmd,TOKENS);
//打印_令牌(NUM_令牌,令牌);
决定(令牌、NUM_令牌);
}
}//端干管
当硬编码
chdir(“test”)
时,如果用户在命令行上输入
“cd test”
tokens[0]
cd
tokens[1]
是字符串
“test”
,但
chdir(tokens[1])
失败,我不明白原因

打印令牌[1]还将“test”显示为存储的字符串。另外,当传递参数以执行_操作时,我被告知会发生冲突类型。在这两个print语句中都显示了正确的字符串。据我所知,没有多余的空格,因为我的tokentize函数将它们全部去掉。我很困惑,这两个部分看起来很简单,但就是不起作用。

代码

char *string = tokens[0];
printf("%s\n", tokens[1]);
success = chdir(string);
将转化为

success = chdir("cd");
我想你想要

char *string = tokens[1];
//                    ^

相反。

token[0]
cd
token[1]
路径。因此,使用
char*string=token[1]
用户不输入
cd test
。他输入
cd测试
,然后按回车键

这意味着您将拥有:

token[0] = "cd";
token[1] = "test\n";
如果没有名为
“test\n”
的目录,它将是
“test”
。您需要去掉最后一个标记中的换行符

e、 g.改变主要任务

char *tmp;
cmd = fgets(buffer, BUFSIZE, stdin);
if (cmd && (tmp = strrchr(buffer, '\n')) != NULL) {
   *tmp = 0;
}

如果
chdir()
失败,它会设置
errno
,因此它应该告诉您失败的原因。您可能会发现打印
string
也很有帮助,这样您就可以准确地看到传递的内容in@user2045236如果您没有做错,
chdir(“test”)
可以,但在命令提示下,您不需要显式地使用
,只需
chtest
即可……在
chdir()之前打印
token[i]
调用并询问它打印的是什么。@GrijeshChauhan当我打印出printf行(“%s\n”,tokens[1])中的标记[1]时;输出为test。@user2045236 ok什么是当前工作目录,test应该在程序所在的路径中running@GrijeshChauhan是的,我的程序在一个名为Lab01的文件夹中,文件夹测试在Lab01文件夹中。所以文件夹测试在工作目录中。你是说
string=token[1]
?你没有的正是问题中已经存在的。@Mike代表akhil更正,我也觉得他想写
[1]
Simonc我认为你的两个答案都是正确的,但OP也说
chdir(代币[1])失败
…据我所知,这意味着你的答案不正确。我是错了吗?还是误解了什么?这是一个我错过的错误,但即使更正了chdir()返回-1,这意味着更改目录失败。我不知道为什么。Grijesh Chauhan您是正确的,使用字符串指针或使用存储的令牌值都不起作用。这就是我感到困惑的原因。@user2045236您没有向我们展示如何计算/分配
令牌[1]
所以很难给出任何具体建议。您是否尝试过记录其值,包括检查任何前导空格?@simonc不确定除此之外如何发送它是认真的吗?enter键添加了一个\n字符?如何剥离该字符?@user2045236它肯定会这样做。在某些系统上,它会添加
\r\n
我不明白为什么会这样(我的大学说我只教了我java之后就需要这门课程),但确实如此!我将在手册页中查找strrchr!非常感谢!@user2045236 strrchr(buffer,“\n”)从缓冲区的结尾开始,在左边搜索\n字符。如果找到一个字符,它将返回指向该字符的指针。在C中,字符串以0字节结尾,因此我们用0字节覆盖\n,这使字符串以0字节结尾