0

私は基本的なシェルをコーディングしています。私の最初の要件は cd をテストすることです。考えられる cd コマンドのすべての条件があり、その後、ls などのコマンドを処理します。今のところ、コードの 1 つのブロックについて本当に混乱しています。

 #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

コードをハードコーディングすると正常chdir("test")に実行されますが、コマンド ラインでユーザー"cd test" tokens[0]が iscdおよびtokens[1]is 文字列を入力して"test"chdir(tokens[1])失敗し、その理由がわかりません。

印刷 tokens[1] には、保存されている文字列として「test」も表示されます。同様に、パラメータを take_action に渡すと、タイプの競合が発生すると言われます。両方の print ステートメントで、適切な文字列が表示されます。私が知る限り、余分なスペースはありません。なぜなら、トークン化機能がそれらをすべて削除するからです。私はとても混乱しています.これらの2つの部分はとてもシンプルに見えますが、うまくいきません.

4

3 に答える 3

4

ユーザーは入力しませんcd test。彼はcd test入力し、Enter キーを押します。

これは、次のことを意味します。

token[0] = "cd";
token[1] = "test\n";

という名前のディレクトリはありませ"test\n""test"。最後のトークンの改行文字を取り除く必要があります。

例:メインの変更

char *tmp;
cmd = fgets(buffer, BUFSIZE, stdin);
if (cmd && (tmp = strrchr(buffer, '\n')) != NULL) {
   *tmp = 0;
}
于 2013-05-30T19:29:36.480 に答える
1

token[0]です。cd_ token[1]_ pathだから使うchar* string=token[1]

于 2013-05-30T16:36:31.880 に答える