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 :

pointeur qui se dé ininitialise


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut pointeur qui se dé ininitialise
    Bonjour à tous,

    J'ai un code qui fonctionne mais avec un pointeur qui se déinitialise?

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    /*  ttt-stripped <t.txt   */
    
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    #define CINQPAGES 10240
    #define LIGNES 100
    #define Date: __DATE__
    
    char strconv[10240];
    char *toConsole ( char *p ) ;
    
    
    char *toConsole ( char *p )
    {
       CharToOemBuffA( p, strconv, 10240 );
       return strconv;
    }
    
    int main( void )
    {
       char *pointeur = ( ( void * )0 );
       char *strst = ( ( void * )0 );
       char *reset = ( ( void * )0 );
       const char *cmp = "End_of_it.";
       int k = 1;
       int i = 0;
       int j = 0;
       char inligne[100] = {0};
       char intexte[3024] = {0};
       char substring[250] = {0};
    
       reset = &intexte[0];
    
       while ( ( ( void * )0 ) != fgets( inligne, sizeof inligne, ( &_iob[0] ) ) ) {
          strcat( intexte, inligne );
       }
    
       strcat( intexte, "\n" );
    
       strcat( intexte, cmp );
       strcat( intexte, "\n" );
       free( inligne );
    
       while ( 0 == strstr( substring , cmp ) ) {
    
          j = 0;
    
          substring[j++] = intexte[i];
          i++;
    
          while ( 1 != isupper( ( unsigned char )intexte[i] ) ) {
             substring[j++] = intexte[i];
             i++;
          }
    
          j--;
    
          while ( 0 == isgraph( ( unsigned char )substring[j] ) ) {
             j--;
          }
          j++;
    
          substring[j] = '\0';
          printf( "after %d--->%s<----\n\n", k++, substring );
          strst = &intexte[i];
    
          while ( ( ( void * )0 ) != ( pointeur = strstr( strst, substring ) ) ) {
             *pointeur++ = ' ';
             do {
                *pointeur++ = ' ';
    
             } while ( 1 != isupper( ( unsigned char )*pointeur ) );
             *( pointeur - 1 ) = ' ';
          }
       printf( "%s\n", toConsole( reset ) );  /*  OK  */
       }
    
       printf( "\n----------fin  -------------\n" );
    
       printf( "%s\n", toConsole( reset ) );  /*  ligne vide   */
    
       free( intexte );
       return 0;
    }
    Fichier.txt sur stdin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ---------------------   <    t.txt  -------------------------------
     
    C1ar, il sera ok hah bomb adil.	    Every shared library has a special.
    C1ar, il sera ok hah bomb adil.
    E3very shared library has a special.
    ---------------------   fin   t.txt  -------------------------------

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Tu pourrais faire un effort pour au moins expliquer ce que tu attends de ton programme, et en quoi ce que tu obtiens diffère de ce que tu attends...

  3. #3
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    Il enlève les phrases qui se répètent. (doublons)

    Mon problème c'est que le pointeur reset (dans la boucle) imprime le texte à la console mais n'imprime rien toute de suite après la dernière boucle à la fin.

    >----------fin -------------
    est imprimé.
    'reset' n'imprime rien.


    Pourquoi perdrait-t-il ses infos?

  4. #4
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    Question complémentaire:

    Est-ce que je pourrais écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int intexte[3024] = {0};
    int substring[250] = {0};
    pour écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( 1 != isupper(*pointeur ) );
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char intexte[3024] = {0};
    char substring[250] = {0};
    pour éviter d'avoir à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( 1 != isupper( ( unsigned char )*pointeur ) );
    Bon ben, marci ben ...

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    * A propos de ton code :
    - ( ( void * )0 ) se remplace plus correctement par NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       char *pointeur = NULL ;....
    - reset = &intexte[0]; s'écrit plus simplement :
    - ( &_iob[0] ) se remplace de façon plus standard par stdin

    - Enfin à partir de
    tout peut arriver : on ne peut appliquer un free que sur un tableau alloué dynamiquement par une fonction de la famille de malloc(). Ce n'est pas le cas ici et le programme va planter à un moment ou à un autre ou avoir un comportement incompréhensible.

    * A propos de ta question complémentaire :
    Le choix des tableaux de char ou de int ne doit dépendre de devoir faire un cast ou non. Il dépend de la logique du programme : quelles grandeurs le tableau est-il censé représenté ?
    Tu peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     while ( 1 != isupper(*pointeur ) );
    // ou
     while ( !isupper(*pointeur ) );
    que *pointeur soit un char ou un int. Aucun cast n'est nécessaire dans un cas comme dans l'autre.
    Accessoirement, je te signale que isupper a un argument dont le type n'est pas un unsigned char mais est un int

  6. #6
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    J'ai nettoyé mon code manuellement. Les trucs genre ( ( void * )0 ) appartenaientt au préprocesseur. J'ai enlevé les unsigned.

    Je ne comprends pas pourquoi la sortie de boucle (0 == strstr(substring , cmp) déréférencie ou le (reset) modifie autrement de façon à imprimer rien.

    J'ai essayé de débugger avec gdb
    (gdb) target exec ttt.exe
    (gdb) run < t.txt
    Je ne sais trop comment faire.
    (ici un tutoriel de base pour gdb en ligne de commande serait le bienvenue)


    J'ai aussi tenté code block mais là non plus rien de clair. En fait je trouve cela encore plus complexe quoique plus attrayant.
    --
    En remplaçant (0 == strstr(substring , cmp) par --k > 0 tout baigne.
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    /*  ttt <t.txt   > t2.txt */
     
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
     
    #define CINQPAGES 10240 
    #define LIGNES 100
    char strconv[CINQPAGES];
    char  *toConsole (char *p) ;
     
     
    char  *toConsole (char *p) 
    {
    CharToOemBuff(p,strconv,CINQPAGES);
    return strconv; 
    } 
     
    int main( void )
    {
       char *pointeur = NULL;
       char *strst = NULL;
       char *reset = NULL;
       const char *cmp = "End_of_it.";
       int i = 0;
       int j = 0;
       int k = 12;
       char inligne[100] = {0};
       char intexte[3024] = {0};
       char substring[250] = {0};
     
       reset = intexte;
     
       while ( NULL != fgets( inligne, sizeof inligne, stdin ) ) {
          strcat( intexte, inligne );
       }
       strcat( intexte, "\n");
       strcat( intexte, cmp);
       strcat( intexte, "\n");
     
       /*   LOOP  */
     
       while ( /*   0 == strstr(substring , cmp)   */    --k > 0    ) {
          j = 0;
     
          /*  créons la phrase à chercher sans '\n' ou espaces blanc terminaux  */
          substring[j++] = intexte[i];
          i++;
     
          while ( 1 != isupper( intexte[i] ) ) {
             substring[j++] = intexte[i];
             i++;
          }
     
          j--;
     
          while (substring[j] == ' ' ||  substring[j] == '\n' || substring[j] == '\t') { /*  0 == faux  */
             j--;
          }
          j++;
     
          substring[j]  = '\0';
          printf("after-->%s--\n\n", substring);
          strst = &intexte[i];
     
           if(strlen(substring) ==  0 )continue;
     
          while ( NULL != ( pointeur = strstr( strst, substring ) ) ) {
     
             do {
                 *pointeur++ = ' ';  
     
             } while ( 1 != isupper(*pointeur));
     
             *( pointeur - 1 ) = '\n';
          }
          fflush( stdout );
       }
     
       /*   FIN  LOOP  */
     
     
    printf( "\n----------fin  -------------\n" );
     
    printf( "%s", toConsole(reset));
     
    return EXIT_SUCCESS;
    }
     
    /*    ttt <t.txt   > t2.txt & t2.txt  */

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

Discussions similaires

  1. ces pointeurs qui me hantent
    Par mesrine dans le forum Débuter
    Réponses: 8
    Dernier message: 12/02/2009, 16h25
  2. Un code avec pointeurs qui ne marche pas
    Par yohannc dans le forum Débuter
    Réponses: 5
    Dernier message: 31/10/2008, 15h18
  3. [MFC] Accès pointeur qui donne rien :s
    Par EagleEye dans le forum MFC
    Réponses: 3
    Dernier message: 02/03/2006, 18h32
  4. Un pointeur qui n'en fait qu'a sa tête...
    Par Zenol dans le forum C++
    Réponses: 10
    Dernier message: 11/09/2005, 16h40
  5. Réponses: 8
    Dernier message: 04/08/2004, 14h17

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