Problème avec STRTOK

Problème avec STRTOK - C++ - Programmation

Marsh Posté le 21-01-2005 à 17:07:08    

Bonjour,
 
je cherche à développer un shell Unix, et pour ce faire j'ai besoin de découper une chaine de caractère (la commande) grace à STRTOK. Le problème, c'est que si tout se passe bien à la compilation, le découpage ne marche absolument pas... Inexpliquable !
 
Je vous copie / colle le code ci dessous, si vous avez une idée, je suis preneur !
 

Code :
  1. #include <wait.h>
  2. #include <iostream>
  3. #include <errno.h>
  4. #include <signal.h>
  5. #include <unistd.h>
  6. #include <string>
  7. #include <fstream>
  8. #define MAX_SIZE 1024
  9. using namespace std;
  10. bool chkQuit(const string &cmd)
  11. {
  12.    if(cmd=="q" || cmd=="quit" || cmd=="exit" || cmd=="x" )
  13.        exit(0);
  14. }
  15. int main()
  16. {
  17.    string cmd, output, tmp;
  18.    static char *argv[MAX_SIZE];
  19.    const char *delim=" ";
  20.    int i=0;
  21.    while(1)
  22.    {
  23.        cout << "esh $ ";
  24.        getline(cin,cmd);
  25.        chkQuit(cmd);
  26.        size_t size = cmd.size() + 1;
  27.        char * buffer = new char[ size ];
  28.        // copier la chaîne
  29.        strncpy( buffer, cmd.c_str(), size );
  30.        buffer[size-1]='\0';
  31.        cout << buffer << endl;
  32.        cout << strtok(buffer," " ) << endl;
  33.        cout << strtok(buffer," " ) << endl;
  34.        cout << strtok(buffer," " ) << endl;
  35.        cout << strtok(buffer," " ) << endl;
  36.        cout << strtok(buffer," " ) << endl;
  37. /*        while (tmp.c_str())
  38.        {
  39.             cout << i << strtok(buffer," " ) << endl;
  40. //            argv[i] = new char[ tmp.size() + 1];
  41. //            strncpy(argv[i],tmp.c_str(),sizeof(argv[i]+1));
  42.            i++;
  43.        }
  44.        cout << "decoupe finie" << endl;
  45.        argv[i]=NULL;
  46.        delete buffer;
  47.        //string argv[]={"ls","-la",NULL};
  48.        //execv(string("/bin/"+cmd).c_str(),argv.c_str());
  49.        i=0;
  50.        while(argv[i]!=NULL) cout << argv[i++] << endl;
  51.        //cout << output << endl;
  52. */    }
  53.    return 0;
  54. }


 
A ce sujet, si quelqu'un a déja programmé un shell unix perso, ce serait sympas de paratager les sources, histoire que ça me donne une petite idée ;)

Reply

Marsh Posté le 21-01-2005 à 17:07:08   

Reply

Marsh Posté le 21-01-2005 à 18:35:48    

hum, il faut que tu tranches entre C et C++.
enleve les char*, strncpy, strtok, ...
pour strtok, il faut bien lire le man, c'est une fonction délicate, non réentrante.
En C++, on ne l'utilise pas.
 
une fois que tu as lu avec le getline, il faut tronçoner en mettant chaque token dans un vector par exemple. Pour ça, utilise std::copy avec istream_iterator<>,back_inserter.
[EDIT] sauf que l'intéret est sans doute d'obtenir les arguments à passer a exec*, dans ce cas, faut faire plus basique. Au risque de me faire taper dessus, c'est un des rares types de programme que j'aurais fait en C.
[\EDIT]
Dans un shell, il faut forker, exec* ne reviendra pas s'il réussi.


Message édité par ++fab le 21-01-2005 à 18:50:24
Reply

Marsh Posté le 21-01-2005 à 18:52:42    

Tu peux trouver des sources de shell partout sur le net.
Va voir a cette page, tu auras plein d'adresses => http://packages.gentoo.org/package [...] app-shells
 
J'ai pas cherché pour ton pbm avec strtok, mais tu pourrais peut etre utiliser LEX/YACC (ou autre) pour parser les lignes de commandes.

Reply

Marsh Posté le 21-01-2005 à 20:43:49    

Bonjour tout le monde (je suis nouveau sur le forum)
 
Bon c'est juste pour dire que strtok s'utilise comme ca lors du 1er appel :
strtok(buffer," " ) -> renvois un pointer sur la 1er chaine
puis par la suite :
strtok(NULL," " ) -> renvois un pointeur sur la chaine suivante
 
(il peut etre interresant de stocker les résultats intermédiaire aussi)
 
et un site où tout est expliqué :
http://www.cplusplus.com/ref/cstring/strtok.html
 
Bon après c'est sûr vaudrait mieux utiliser des string en C++


Message édité par Tarabiscote le 21-01-2005 à 20:45:35
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed