2010-09-16 9 views
0

J'écris un shell linux pour mon système d'exploitation classe. J'ai éliminé la majorité, mais je suis coincé sur de simples comparaisons de chaînes. J'ai tout ce que je peux penser. strcmp devrait prendre dans \ 0 les chaînes terminées et retourner 0 pour égal mais cela ne semble pas fonctionner et même marcher dans le tableau et vérifier chaque char ne fonctionne pas non plus. J'ai actuellement cmd [0] dans le strcmp je sais que ce n'est pas juste qu'il doit être terminé par zéro, mais j'ai essayé d'utiliser strcpy et strcat \ 0 à une autre chaîne. Si quelqu'un pouvait signaler mon erreur, ce serait très apprécié.tableaux de caractères, et comment utiliser des pointeurs strtok et STRCMP

//Matthew Spiers 
//CSC306 

#include <string.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

using namespace std; 

void ckCmd(char dir[]); 
int main(){ 

    pid_t pid; 
    char cdstr[4] = "cd"; 
    char str[50]; 
    char *cmd[3]; 
    char *pstr; 
    char temp[50]; 
    char dir[50] = "/bin/"; 
    while(1){ 
     pid = fork(); 
     if(pid < 0){ 
      fprintf(stdout, "Fork Failed"); 
     } 
     else if(pid == 0){ 
      fprintf(stdout, "\e[36m306.SH>\e[0m"); 
      fgets(str, 50, stdin); 
      for(int i =0; i<50; i++){ 
       if(str[i] == '\n'){ 
        str[i] = '\0'; 
       } 
      } 
      strcpy(temp, str); // Make a copy of original string 
      cmd[0] = strtok(str, " "); 
      for(int i =1; i<3; i++){ 
       cmd[i] = strtok(NULL, " "); 
      } 
      strcat(dir, cmd[0]); 

      cout << cmd[0]; 

        pstr = strtok(temp, " "); //pull out only first token 
      //Change Directory 
      if(!strcmp(pstr, "cd")){ //if first token is cd 
       //either branch to a routine just change directory 
       //ie branch and change directory 
      } 
      //ckCmd(temp); 

      execlp(dir, cmd[0], cmd[1], cmd[2], NULL); 
      _exit(0); 
     } 
     else{ 
      wait(NULL); 
     } 
    } 
} 

void ckCmd(char str[]){ 
    char *p; 
    p = strtok(str, " "); 
    if(p[0] == 'c'){ 
     chdir("new"); 
    } 
} 

    enter code here 
+1

Même si les fonctions dont vous parlez sont pures C, l'inclusion indique que vous utilisez C++, j'ai donc retiré l'étiquette, retag si vous le jugez approprié. Une fois que vous allez utiliser C++, je vous conseille d'utiliser 'std :: string' et d'éviter d'utiliser' strtok' et 'strcmp', sauf si cela fait partie des exigences de l'exercice. –

+0

Balise modifiée de C++ à C – Nikko

+0

[EDIT] Surligné une ligne, passons. – jv42

Répondre

0

Qu'est-ce qui ne fonctionne pas exactement? Pouvez-vous montrer un échantillon de code plus petit?

La ligne:

strcat(dir, cmd[0]); 

Savez-vous que dir est la cible ici et non cmd[0]?

La ligne: !strcmp(cmd[0], "cd") par lui-même est correct, mais on ne sait pas exactement ce que vous essayez de faire. Pourriez-vous commenter chaque groupe de ligne avec vos intentions?


Mise à jour: Je suggère que vous essayez trop de choses à la fois. Pour rentrer dans votre problème, je recommande les étapes suivantes:

  1. Comprendre comment fonctionne strtok. Il n'est pas très difficile - lisez son manuel et ensuite essayez-le dans un fichier séparé avec quelques chaînes. Cela devrait vous donner une bonne idée.
  2. parties de la rupture de votre code et de les fournir avec entrée prédéfinie (pas de l'utilisateur et sans fork). Voir où le comportement est comme prévu et où il dérive.
+0

// Changer de répertoire si { // Do Something //-à-dire la branche et le répertoire de changement } ckCmd (temp) (strcmp (cmd [0], "cd")!); Cette partie. Tout le reste fonctionne bien Je me rends également compte que cmd [0] ne va pas au travail parce qu'il n'a pas de \ 0. J'ai essayé: en copiant la chaîne d'origine sur temp puis en retirant le premier jeton et même en ajoutant le \ 0 après cela, je ne sais pas si strtok se termine par null.En outre, il était un peu vague dans les exigences. L'un des objectifs est de comprendre strtok() mais il n'a pas dit implicitement de l'utiliser. – Matt

+0

J'ai ajouté quelques commentaires et changé cmd [0] – Matt

+0

@Matt: J'ai mis à jour ma réponse –

1

strtok n'est pas rentrante/thread-safe! Vous devez utiliser la valeur de RETOUR strtok:

p = strtok(str, " "); 
    if(p[0] == 'c'){ 

cmd[0] = strtok(str, " "); 
... 
if(!strcmp(cmd[0], "cd")){ 

Si p/cmd [0] est NULL, il se bloque.

+0

devrais-je juste utiliser strok_r écrire mon propre code pour analyser les chaînes? – Matt

+1

Si vous avez une version sans bug strtok_r, prenez-le, mais ce n'est pas standard. Si vous ne l'avez pas, vous pouvez prendre ma version sur http://stackoverflow.com/questions/3375530/parse-tokens-from-a-string-c-programming-strtok-issue/3418673#3418673 – user411313