IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Choix à faire pour analyse d'une chaine


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Choix à faire pour analyse d'une chaine
    Bonjours!
    J'essaye de faire un espèce d'explorateur de dossiers en console pour le plaisir. L'utilisateur rentrera une commande du genre "list 'répertoire'" ou bien "read 'nomDuFichier'", enfin vous comprenez. Mon problème, c'est pour la reconnaissance de la commande, j'ai pensé à strstr() mais si il tape "fmekslfnejskenmslist popife" ça va renvoyer vrai. Mon autre problème, c'est pour récupérer le chemin... Bref j'ai pensé à des trucs mais rien ne marche alors je vous demande qu'est-ce que vous feriez à ma place, expressions régulières ou me faire chier à gérer ça moi-même (J'ai aucune idées comment faire)...Merci beaucoup!

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    pour la commande, juste un strcmp machera très bien.... ou strcasecmp.

    Pour le nom du chemin, je vois pas ton problème...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Tu veux dire que je fasse quoi avec strcmp, une boucle, parce que c'est qu'un caractère non? En fait mon gros problème c'est pour la syntaxe de ce programme je veux un ordre précis d'entrées: <commande><espace><chemin> et rien d'autre et je m'imagine pas comment l'implémenter....avec strcmp...

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ça se fait parfaitement avec... allez je t'aide..

    Je te donne la liste des fonctions dont tu auras besoin. A charge pour toi d'aller chercher dans les tutoriels et cours comment on es utilise. Ensuite, tu nous présente un essai de code, et on t'aidera.. Mais on le fera pas à ta place

    Donc il te faudra :

    pour la commande : strcasecmp
    pour le chemin : strcpy

    Plus

    malloc
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je ne veux surtout pas de code rassure toi, j'ai un but entièrement pédagogique mais premièrement, j'ai cherché un peu pour trouver les docs de la libc mais j'ai pas trop trouvé sauf des pas clairs ou non mises-à-jour, où est-ce qu'elle est? J'essaye le man mafonction() mais c'est la même chose
    Et puis je réfléchis un peu....je vais tester un code mais là j,ai des problèmes avec mon gcc, le temps que je règle cela et puis je m'y plonge!

    Bon en fait, j'ai pondu un petit code juste pour reconnaitre si il y a de tapé "list ou "exit" mais bon...je sais pas si je suis sur la bonne voie....

    Le voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "gets.h"
     
     
    int main(int argc, char *argv[])
    {
    	char cmd[100+1];
    	size_t sizeCmd = sizeof cmd;
     
    	int exit = 0;
     
    	printf("Veuillez entrer une commande...\n");
    	while (!(exit))
    	{
    		printf("> ");
    		get_s(cmd, sizeCmd); //Fonction de saisie d'entrée correcte
     
    		if (strncasecmp("list", cmd, 3) == 0) //0 est la valeur renvoyée si égal
    		{
    			printf("Commande list reconnue\n");
    		}
    		else if(strncasecmp("exit", cmd, 3) == 0) //0 est la valeur renvoyée si égal
    		{
    			printf("Commande exit reconnue\n");
    			exit = 1;
    		}
    		else
    			printf("Commande non reconnue\n");
    	}
    	return 0;
    }

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    c'est pas mauvais du tout

    Sauf que "list" est "exit" ça fait 4 caractères et non pas 3..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    [EDIT] Grillé!!!

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    regarde on s'est croisé
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    C'est pour celà que j'ai marqué Grillé!
    Mais les tableaux de char ça commence à 0 non? Donc si on compte cmd[0] = 'e', cmd[1] = 'x', cmd[2] = 'i', cmd[3] = 't'....

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Mais y'a pas de Big Doc C pour toutes les fonctions standards de la libC? Ça serait cool!

  12. #12
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    personellement j'aurais conseillé un strncmp avec "list " (on attend un espace apres la commande)
    ensuite, tu dois recuperer ton chemin, qui devrais se trouver a partir de: cmd[5] et se terminer quand tu trouve un '\0'.

    tu peux a partir de la envoyer ton chemin a des fonctions standards (tu leur passe juste cmd[5]) et tu controle ce qu'elles renvoient.
    sinon tu peux aussi t'assurer que le chemin est d'une forme correcte (mais la, ça deviens un peu plus compliqué)
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bon, enfin réussi, ça peut surement être optimisé mais ça marche
    Je suis capable de récupérer la commande ainsi que son argument!
    Je continue donc avec le dirent.h!

    Voilà le code tout beau tout chaud:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "gets.h"
     
    char *get_arg(const char *string, int debut, int fin);
    long get_fin(const char *chaine);
     
    int main(int argc, char *argv[])
    {
    	char cmd[100+1];
    	size_t sizeCmd = sizeof cmd;
     
    	int exit = 0;
     
    	printf("Veuillez entrer une commande...\n");
    	while (!(exit))
    	{
    		printf("> ");
    		get_s(cmd, sizeCmd); //Fonction de saisie d'entrée correcte
     
    		if (strncasecmp("list", cmd, 3) == 0) //0 est la valeur renvoyée si égal
    		{
    			printf("Commande list reconnue\n");
    			char *arg = get_arg(cmd, 5, get_fin(cmd)); //On récupère l'argument
    			printf("Argument: %s\n", arg); //On affiche l'argument
    		}
    		else if(strncasecmp("exit", cmd, 3) == 0) //0 est la valeur renvoyée si égal
    		{
    			printf("Commande exit reconnue\n");
    			exit = 1;
    		}
    		else
    			printf("Commande non reconnue\n");
    	}
    	return 0;
    }
     
     
    char *get_arg(const char *chaine, int debut, int fin)
    {
    	if(debut < fin)
    	{
    		//Calcul et création de la nouvelle chaine
    		size_t taille_c = sizeof (char) * (fin - debut) + 1;
    		char *nouvelle_c = malloc(taille_c);	
     
    		//Copie des char voulus de chaine vers nouvelle_c
    		long i;
    		for (i = debut; i <= fin ; i++)
    		{
    			nouvelle_c[i - debut] = chaine[i];
    		}
     
    		return nouvelle_c;
    	}
    	else
    		printf("Erreur!\n");
    }
     
    long get_fin(const char *chaine) //Calcul de la fin de la chaine
    {
    	long i;
    	for(i = 0; chaine[i] != '\0'; i++);
    	return i;
     
     
    }
    Mais j'aurais vraiment pas trouvé sans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     /*Cette fonction permet d'extraire une sous-chaîne de s comprise entre l'indice start et end.*/
     
    char *str_sub (const char *s, unsigned int start, unsigned int end)
    {
       char *new_s = NULL;
     
       if (s && start < end)
       {
    /* (1)*/
          new_s = malloc (sizeof (*new_s) * (end - start + 2));
          if (new_s)
          {
             int i;
     
    /* (2) */
             for (i = start; i <= end; i++)
             {
    /* (3) */
                new_s[i-start] = s[i];
             }
          }
          else
          {
             fprintf (stderr, "Memoire insuffisante\n");
             exit (EXIT_FAILURE);
          }
       }
       return new_s;
    }
    Grâce aux indices, on calcule la taille de la sous-chaîne (1), ensuite on parcourt s entre les deux indices (2) pour copier chaque caractère dans la sous-chaîne (3).
    pour m'inspirer!

    Merci beaucoup, je vous tient au courant de la suite!

  14. #14
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Joe005
    Mais y'a pas de Big Doc C pour toutes les fonctions standards de la libC? Ça serait cool!
    Il y a les pages de man sur developpez:

    Sinon, il y a également cela:

    A noter que strcasecmp n'est pas standard.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/11/2007, 10h22
  2. Réponses: 1
    Dernier message: 26/03/2007, 12h58
  3. Comment faire un explode sur une chaine comme suit ?
    Par sebnutt dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 11h59
  4. [VBA-E]Comment faire pour écrire dans une page excel existante ?
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/05/2006, 13h54
  5. [C#] Comment faire pour rendre invible une colonne(ListView)
    Par Jfrancois57 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/05/2004, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo