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 :

Selectionner une chaine de caractère grace à un déplacement


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Par défaut Selectionner une chaine de caractère grace à un déplacement
    Bonjour,
    J'aimerais savoir comment récupérer "0G" dans la chaine "*FAILING PROGRAM JSAD0G OBJ-JSAD0G +00000464 TRC-JSAD LOADSET-BASE " stockée dans displayProgramVersion().
    En sachant que "OG" est la version du programme qui à crash et "JSAD" est le programme. Mais le programme change en fonction du dump, donc il faut récupérer "OG" à l'aide d'un déplacement.

    Voici mon code :
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #define MAX_SIZE 136
     
    char * binstr(char * bin, int lngmax, const char * str){
            int lngstr = strlen(str);
            char * ret = NULL;
            for(int i=0; i<lngmax-lngstr; i++){
                if(memcmp(bin+i,str,lngstr)==0){
                    ret=bin+i;
                    break;
                }
            }
            return ret;
    }
     
    struct s_search {
        char *searched_value;
        char *id;
        bool found;
        int size;
        void (*other_treatment)(char *);
    };
     
    void displayProgramVersion(char *str) {
     
    }
     
    int main(void) {
            struct s_search search[]={
                {"FAILING PROGRAM              ","Prgm : ",false,4,displayProgramVersion},
                {"DATE - ","Date : ",false,5,NULL},
                {"TIME - ","Heure : ",false,8,NULL},
                {"START OF POST PROCESSING RUN FOR DUMP ","Ref : ",false,4,NULL},
                {"SYSTEM ERROR NUMBER   ","Ctrl : ",false,11,NULL},
            };
     
            int nsearch=sizeof(search)/sizeof(search[0]);
            int numline=0;
            FILE* infile = fopen("./Dumps/dumpJSAD.txt", "rb");
            FILE* outfile = fopen("sortie.txt", "wb");
            char read_line[MAX_SIZE];
     
            if(infile != NULL){
                while(fgets(read_line,sizeof(read_line),infile)) {
                    numline++;
                    for(int i=0;i<nsearch;i++){
                        if(!search[i].found) {
                            char *rc=binstr(read_line,MAX_SIZE,search[i].searched_value);
                            if(rc) {
                                fprintf(outfile,"%d-%s%.*s\r\n",numline,search[i].id,search[i].size,rc+strlen(search[i].searched_value));
                                if(search[i].other_treatment!=NULL)
                                    search[i].other_treatment(read_line);
                                search[i].found=true;
                            }
                        }
                    }
                }
            }
            fclose(infile);
            fclose(outfile);
    }
    En gros que mettre dans ma fonction displayProgramVersion();

    Merci de votre temps

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Un déplacement ? Tu veux dire un offset ? Utiliser + depuis le début de la chaîne pour avoir une chaîne qui débute au X-ième caractère ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Par défaut
    Je ne sais pas ce qu'est un offset.
    En gros il faut qu'en lisant la ligne FAILING PROGRAM, il faut que je récupère "0G" qui est la version, juste après le "JSAD" qui est le nom du programme.
    J'ai eu une aide de mes collègues et ils m'ont dit de faire la même recherche que le nom du programme et de faire +4 au pointeur mais j'ai pas compris ce que ça voulait dire.

    Voici mon code actuel :
    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
    69
    70
    71
    72
    73
    74
    75
    /*
    		VERSION 4 : - TOUTES LES INFORMATIONS
    */
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #define MAX_SIZE 136
     
    char * binstr(char * bin, int lngmax, const char * str){
        	int lngstr = strlen(str);
       		char * ret = NULL;
        	for(int i=0; i<lngmax-lngstr; i++){
            	if(memcmp(bin+i,str,lngstr)==0){
                	ret=bin+i;
                	break;
            	}
        	}
        	return ret;
    }
     
    struct s_search {
        char *searched_value;
        char *title_to_display;
        bool already_displayed;
        int display_size;
    };
     
    int main(int argc, char *argv[])
    {
    	if (argc != 2) {
    	    printf("usage: %s chemin\n", argv[0]);									
            return EXIT_FAILURE;
        }
     
    	struct s_search search[]={
        	{"FAILING PROGRAM              ","Programme : ",false,2},
            {"FAILING PROGRAM              ","Programme : ",false,4},
        	{"DATE - ","Date : ",false,5},
        	{"TIME - ","Heure : ",false,8},
        	{"START OF POST PROCESSING RUN FOR DUMP ","Référence : ",false,4},
        	{"SYSTEM ERROR NUMBER   ","Ctrl : ",false,11},
        	{"          +","Déplacement : ",false,9},
        	{"  R0","R0",false,42},
        	{"  R2","R2",false,42},
        	{"  R4","R4",false,42},
        	{"  R6","R6",false,42},
        	{"  R8","R8",false,42},
        	{"  R10","R10",false,42},
        	{"  R12","R12",false,42},
        	{"  R14","R14",false,42}
    	};
     
    	int nsearch=sizeof(search)/sizeof(search[0]);
        FILE* infile = fopen(argv[1], "rb");
        FILE* outfile = fopen("sortie.txt", "wb");
        char read_line[MAX_SIZE];
     
    	if(infile != NULL){
    		while(fgets(read_line,sizeof(read_line),infile)) {
        		for(int i=0;i<nsearch;i++){
            		if(!search[i].already_displayed) {
                		char *result=binstr(read_line,sizeof(read_line),search[i].searched_value);
                		if(result){
                    		fprintf(outfile,"%s%.*s\r\n",search[i].title_to_display,search[i].display_size,result+strlen(search[i].searched_value));
                    		search[i].already_displayed=true;
                		}
            		}
            	}
    		}
    	}
    	fclose(infile);
    	fclose(outfile);
    }

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ElouanB Voir le message
    Je ne sais pas ce qu'est un offset.
    Et tu te dis "développeur" dans ton profil ???
    C'est le nom utilisé par les vrais développeurs pour "décalage". Si par exemple ta chaine "ch" vaut "Hello", alors "ch+1" ne vaut plus que "ello" et "ch+2" ne vaut plus que "llo". Pour faire simple, tu pars du début de la chaine, puis tu te décales de ce qui est demandé et tu lis de là jusqu'à la fin.

    Citation Envoyé par ElouanB Voir le message
    J'ai eu une aide de mes collègues et ils m'ont dit de faire la même recherche que le nom du programme et de faire +4 au pointeur mais j'ai pas compris ce que ça voulait dire.
    Ben ça veut dire surtout que t'as de très grosses lacunes à combler avant de t'attaquer à ce genre de problème et avant de pouvoir te dire "développeur".
    Parce que les pointeurs sont la base du mécanisme du C. Et si tu ne piges pas les pointeurs, alors tu ne pourras jamais programmer en C.
    C'est comme si tu voulais aller à la maison de ta copine sans connaitre son adresse, et que la seule chose que tu saches c'est qu'elle habite à 4 portes d'un salon de coiffure. Donc tu trouves le salon et tu te décales de 4.
    Donc là encore pour faire simple, une chaine ce sont des lettres, chaque lettre placée dans une case mémoire l'une après l'autre. Et un pointeur c'est juste l'adresse d'une case. Et le nom de la chaine c'est l'adresse du premier caractère (donc un pointeur sur le premier caractère).
    Donc si tu pars de cette adresse et que tu lis ensuite chaque case jusqu'à la fin, tu récupères toute la chaine. Mais si tu pars d'un pointeur sur lequel tu appliques un décalage de (par exemple 2), alors tu sautes les deux premiers caractères de la chaine et tu ne récupères que ce qui reste ("llo" dans le cas de "Hello")
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *s="Hello";
    printf("%p %s\n", s, s);
    printf("%p %s\n", s+2, s+2);
    Si donc tu arrives à placer un pointeur sur "0G =truc" et que tu décales ce pointeur de 4, tu récupères "truc".

    Citation Envoyé par ElouanB Voir le message
    En gros que mettre dans ma fonction displayProgramVersion();
    En gros essaye déjà un truc de ce genre
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void displayProgramVersion(char *str) {
        char *pt;
        if ((pt=strstr(str, "0G")) == NULL) return;
        printf("%s\n", pt+4);
    }

    Ensuite au lieu de venir ici mendier une connaissance qui te dépasse, télécharge-toi un tuto de C, lis-le et fais les exos ce sera plus rentable.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Par défaut
    J'ai compris les bases des pointeurs, seulement pour récupérer "0G" (le premier), il faudrait que dans mon fprintf je fasse %s+4. Le problème c'est que le print est dans une boucle qui affiche toute mes infos donc elles vont toutes êtres décaler de 4. Il me faut seulement décaler de +4 pour la version.

    Et en sois pour le 0G que ce soit le 1er ou le 2eme, ça ne change rien, l'important est de le récupérer. Mais c'est plus facile si c'est le 1er.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ElouanB Voir le message
    Le problème c'est que le print est dans une boucle qui affiche toute mes infos donc elles vont toutes êtres décaler de 4. Il me faut seulement décaler de +4 pour la version.
    Hé oui. Parce que ce code utilise une structure de recherche qui se décompose ainsi
    • la valeur cherchée
    • le message à afficher
    • un booléen indiquant si le truc a déjà été affiché ou pas
    • le nb de lettres à afficher à partir de l'info trouvée


    Donc toutes les infos trouvées seront affichées à partir de la position de l'info, et non à partir d'un offset éventuel. Et comme cette structure est utilisée pour toute recherche, elle ne peut pas fonctionner différemment pour 0G

    Il te faut la modifier ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct s_search {
        char *searched_value;
        char *title_to_display;
        bool already_displayed;
        unsigned short display_size;
        unsigned short offset;
        // Oui, unsigned short parce que ça ne sert à rien de mettre "int" pour des nombres positifs qui visiblement ne dépasseront pas la centaine !!!
    };

    Ensuite lors du remplissage, tu rajoutes ", 0" à chaque ligne (ex {"FAILING PROGRAM ","Programme : ",false,2}, devient {"FAILING PROGRAM ","Programme : ",false,2,0}, (et qu'est'ce que ce serait bien si c'était un peu aéré !!!) et pareil pour toutes les autres lignes... sauf pour la ligne "0G" qui n'existe pas mais que tu vas devoir créer et qui devrait ressembler à ceci: {"0G ", "Programme crashed: ", false, 4, 4}, (c'est pas mieux avec des espaces pour faciliter la lecture ???).

    Et enfin tu remplaces le fprintf(outfile, "%s%.*s\r\n", search[i].title_to_display, search[i].display_size, result + strlen(search[i].searched_value)); qui affiche le résultat pris à partir de l'info cherchée par fprintf(outfile, "%s%.*s\r\n", search[i].title_to_display, search[i].display_size, result + strlen(search[i].searched_value) + search[i].offset); qui affichera le résultat décalé de l'offset.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Par défaut
    Merci.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. selectionner une chaine de caractères
    Par hungtuan dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 30/08/2011, 17h58
  3. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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