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 :

Problème comparaison de chaines


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut Problème comparaison de chaines
    Bonsoir, peut-être bon appétit ?

    Voila j'ai un problème sur ce code (j'obtiens une erreur de segmentation) je pense que le problème vient du strcmp dans le while (i<G.n || strcmp(G.tabsommet[i].Ip,Ip1))!=0) de la fonction chargement .

    J'avais fait quelques tests précédemment en m'arrangeant pour que les deux chaines soient égales et le strcmp devait renvoyer 0 ... mais non ^^ .

    Le but est de créer une matrice représentant les differentes liaisons dans un réseau, afin de créer par la suite un graphe.

    Pour cela on dispose d'un fichier dont la déscription est donnée au début du code.

    D'avance Merci

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    #include <stdio.h>
     
    #include <stdlib.h>
     
    #include <string.h>
     
     
     
    //Format de fichier Imaginé 
     
    /*
     
     
     
    nb //Nombre de sommets 
     
     
     
    //Liste des Sommets Associés a leur Ip
     
    Sommet1 0.0.0.1
     
    Sommet2 0.0.0.2
     
              .
     
              .
     
              .
     
    Sommetnb *.*.*.*
     
     
     
     
     
    //Liste des Connexions
     
    0.0.0.1 0.0.0.2
     
    0.0.0.1 0.0.0.3
     
            .
     
            .
     
            .
     
    *.*.*.* *.*.*.*
     
     
     
    EOF
     
    */
     
     
     
     
     
    typedef struct {
     
    char nom[50];
     
    char Ip[16];
     
    }TypeSommet;
     
     
     
    typedef struct{
     
    TypeSommet * tabsommet;
     
    char ** matrice;
     
    int n;
     
    }Graphe;
     
     
     
    char ** Alloc (int n)
     
    {
     
    int i;
     
    char ** mat;
     
    mat=(char**)malloc(n*sizeof(char*));
     
    for(i=0;i<n;i++)
     
    mat[i]=(char*)calloc(n,sizeof(char));
     
    return mat;
     
    }
     
     
     
    Graphe Chargement (char * fichier)
     
    {
     
    Graphe G;
     
    int i,j;
     
    char Ip1[16],Ip2[16];
     
    FILE *fp;
     
    if((fp=fopen(fichier,"rt"))==NULL)
     
    {
     
    puts("Erreur d'ouverture du fichier");
     
    exit(1);
     
    }
     
    fscanf(fp,"%d",&G.n);
     
    G.matrice=Alloc(G.n); 
     
    G.tabsommet=(TypeSommet*)malloc(G.n*sizeof(TypeSommet));
     
    for(i=0;i<G.n;i++)
     
    {
     
    fscanf(fp,"%s",G.tabsommet[i].nom);
     
    fscanf(fp,"%s",G.tabsommet[i].Ip);
     
    }
     
    while (!feof(fp))
     
    {
     
    fscanf(fp,"%s",Ip1);
     
    fscanf(fp,"%s",Ip2);
     
    i= 0;
     
    while (i<G.n || strcmp(G.tabsommet[i].Ip,Ip1))!=0) i++;
     
    printf("%d\n",i);
     
    j=0;
     
    while (j<G.n || strcmp(Ip2,G.tabsommet[j].Ip)!=0) j++;
     
    printf("%d",j);
     
    G.matrice[i][j]=1;
     
    }
     
    fclose(fp);
     
    return G;
     
    }
     
     
     
    void Affiche (Graphe G)
     
    {
     
      int i,j;
     
      for(i=0;i<G.n;i++)
     
      {
     
      for (j=0;j<G.n;j++)printf("%c",G.matrice[i][j]);
     
      puts("");
     
      }
     
    }
     
     
     
     
     
    int main ()
     
    {
     
    Graphe G;
     
    G=Chargement("Sauvegarde.txt");
     
    Affiche(G);
     
    return 0;
     
    }

  2. #2
    Membre éprouvé
    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
    Par défaut
    gaffe, tu utilise

    controle plutot le retour de tes fscanf (qui echouent probablement)
    avant de te lancer dans la boucle.

    edit::ajout:
    http://c.developpez.com/faq/c/?page=...RS_fin_fichier

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut
    Pourtant un (de même avec Ip2) dans ce while affiche bien les bonnes Ip et l'erreur semble se produire à l'arrivée sur le second while.

    Bizarre autant qu'étrange

    De meme un strcmp en dehors du second while
    celui ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (i<G.n || strcmp(G.tabsommet[i].Ip,Ip1)!=0) i++;
    renvoie les bonnes valeurs je n'y comprend plus rien

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Je pense qu'il y a un certain nombre de choses qui ne font pas ce que tu veux là dedans

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    char ** Alloc (int n)
    
    {
    
    int i;
    
    char ** mat;      // Et l'initialisation ???
    
    mat=(char**)malloc(n*sizeof(char*)); // Et le test si ça échoue ?? 
    
    for(i=0;i<n;i++)
                                         // Et pourquoi une ligne vide ici ?
    mat[i]=(char*)calloc(n,sizeof(char)); // Et le test si ça échoue ?? 
    
    
    return mat;
    
    }
    
    
    
    Graphe Chargement (char * fichier)
    
    {
    
    Graphe G;
    
    int i,j;
    
    char Ip1[16],Ip2[16];
    
    FILE *fp;  // Et l'initialisation ???
    
    
    if((fp=fopen(fichier,"rt"))==NULL)
    
    {
    
    puts("Erreur d'ouverture du fichier");
    
    exit(1);
    
    }
    
    fscanf(fp,"%d",&G.n);
    
    G.matrice=Alloc(G.n); 
    
    G.tabsommet=(TypeSommet*)malloc(G.n*sizeof(TypeSommet));
    
    for(i=0;i<G.n;i++)
    
    {
    
    fscanf(fp,"%s",G.tabsommet[i].nom);
    
    fscanf(fp,"%s",G.tabsommet[i].Ip);
    
    }
    
    while (!feof(fp))
    
    {
    
    fscanf(fp,"%s",Ip1);
    
    fscanf(fp,"%s",Ip2);
    
    i= 0;
    
    // Es-tu sûr que c'est ça  ???  (pas d'accolade)
    while (i<G.n || strcmp(G.tabsommet[i].Ip,Ip1))!=0) i++; 
    
    printf("%d\n",i);
    
    j=0;
    
    // Es-tu sûr que c'est ça  ???  (pas d'accolade)
    while (j<G.n || strcmp(Ip2,G.tabsommet[j].Ip)!=0) j++;
    
    printf("%d",j);
    
    G.matrice[i][j]=1;
    
    }
    
    fclose(fp);
    
    return G;
    
    }
    
    
    
    void Affiche (Graphe G)
    
    {
    
      int i,j;
    
      for(i=0;i<G.n;i++)
    
      {
    
      for (j=0;j<G.n;j++)printf("%c",G.matrice[i][j]);
    
      puts("");  // Qu'est-ce que ça fait ça ??
    
      }
    
    }
    
      
    
    
    
    int main ()  // int main( void)

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut
    Citation Envoyé par souviron34
    Je pense qu'il y a un certain nombre de choses qui ne font pas ce que tu veux là dedans

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    char ** Alloc (int n)
    
    {
    
    int i;
    
    char ** mat;      // Et l'initialisation ???
    
    mat=(char**)malloc(n*sizeof(char*)); // Et le test si ça échoue ?? 
    
    for(i=0;i<n;i++)
                                         // Et pourquoi une ligne vide ici ?
    mat[i]=(char*)calloc(n,sizeof(char)); // Et le test si ça échoue ?? 
    
    
    return mat;
    
    }
    
    
    
    Graphe Chargement (char * fichier)
    
    {
    
    Graphe G;
    
    int i,j;
    
    char Ip1[16],Ip2[16];
    
    FILE *fp;  // Et l'initialisation ???
    
    
    if((fp=fopen(fichier,"rt"))==NULL)
    
    {
    
    puts("Erreur d'ouverture du fichier");
    
    exit(1);
    
    }
    
    fscanf(fp,"%d",&G.n);
    
    G.matrice=Alloc(G.n); 
    
    G.tabsommet=(TypeSommet*)malloc(G.n*sizeof(TypeSommet));
    
    for(i=0;i<G.n;i++)
    
    {
    
    fscanf(fp,"%s",G.tabsommet[i].nom);
    
    fscanf(fp,"%s",G.tabsommet[i].Ip);
    
    }
    
    while (!feof(fp))
    
    {
    
    fscanf(fp,"%s",Ip1);
    
    fscanf(fp,"%s",Ip2);
    
    i= 0;
    
    // Es-tu sûr que c'est ça  ???  (pas d'accolade)
    while (i<G.n || strcmp(G.tabsommet[i].Ip,Ip1))!=0) i++; 
    
    printf("%d\n",i);
    
    j=0;
    
    // Es-tu sûr que c'est ça  ???  (pas d'accolade)while (j<G.n || strcmp(Ip2,G.tabsommet[j].Ip)!=0) j++;
    
    printf("%d",j);
    
    G.matrice[i][j]=1;
    
    }
    
    fclose(fp);
    
    return G;
    
    }
    
    
    
    void Affiche (Graphe G)
    
    {
    
      int i,j;
    
      for(i=0;i<G.n;i++)
    
      {
    
      for (j=0;j<G.n;j++)printf("%c",G.matrice[i][j]);
    
      puts("");  // Qu'est-ce que ça fait ça ??
    
      }
    
    }
    
      
    
    
    
    int main ()  // int main( void)

    Alors je vais tenter de répondre à tous tes commentaires ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ** mat;      // Et l'initialisation ???
    C'est juste une allocation (qui suit en dessous d'ailleurs)

    Les tests si ça échoue ne sont pas fait c'est vrai mais je ne crois pas que le problème se trouve là.

    Pour ce qui est de la ligne vide elle est insérée automatiquement par la mise en page du code.

    L'intitialisation de fp se fait dans le if.

    Pour les pas d'accolade ca ne fera qu'incrémenter i ou j selon le cas.

    le ne sert qu'a la mise en page de la matrice une fois arrivé en bout de ligne va a la ligne pour en refaire une nouvelle

    Et = En espérant t'avoir répondu

  6. #6
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par MsTik
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ** mat;      // Et l'initialisation ???
    C'est juste une allocation (qui suit en dessous d'ailleurs)
    Toujours beaucoup mieux d'initialiser TOUS les pointeurs.. M'enfin tu fais ce que tu veux...

    Citation Envoyé par MsTik
    Les tests si ça échoue ne sont pas fait c'est vrai mais je ne crois pas que le problème se trouve là.
    pt'êt ben que non, mais pt'êt ben que oui ....

    TOUJOURS faire les tests de retour...

    Citation Envoyé par MsTik
    Pour ce qui est de la ligne vide elle est insérée automatiquement par la mise en page du code.
    Change ta mise en page......

    Citation Envoyé par MsTik
    Pour les pas d'accolade ca ne fera qu'incrémenter i ou j selon le cas.
    et alors pourquoi as-tu en dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    printf("%d",i);
     
    ...
     
    printf("%d",j);
    Ils imprimeront le max de la boucle + 1 ....

    Et ton i, j dans ton matrice[i][j] est donc en dehors des bornes (d'où crash er coredump), et qui plus est une seule valeur....

    Il FAUT que tu mettes les accolades autour des while.....


    Citation Envoyé par MsTik
    le ne sert qu'a la mise en page de la matrice une fois arrivé en bout de ligne va a la ligne pour en refaire une nouvelle
    et printf (\n") ça fait quoi ? autant être cohérent...


    Citation Envoyé par MsTik
    la manière standard est soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main ( void )
     
    // ou
     
    int ( int argc, char **argv)
    En espérant t'avoir répondu [/QUOTE]

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut
    et alors pourquoi as-tu en dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d",i);   ...   printf("%d",j);
    C'était pour voir si j'arrivait a dépasser le while mais comme l'affichage ne se fait pas j'en est déduit que j'avais une erreur avant ces printf donc dans le while.
    Les while ne sont là que pour parcourir le tableau,trouver l'indice de l'ip correspondant qui se retrouvera ainsi dans i ou j

    Pour ce qui est des codes de retour il est vrai que j'aurais du les faire mais j'étais plutot préoccupé par ce problème de SIGSEV

    Et pour le mise en page je me suis mal exprimé c'est celle du forum dont je voulait parler

    Je ne vois pas pourquoi un printf("\n"); serait plus cohérent qu'un puts("");

    Et par initialiser les pointeur tu veux dire a NULL ? Je pensais que le malloc gérait toute l'allocation et donc cette partie .


    Et pour toi , oui rien que pour toi je rajouterai void dans mon int main

  8. #8
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par MsTik
    C'était pour voir si j'arrivait a dépasser le while mais comme l'affichage ne se fait pas j'en est déduit que j'avais une erreur avant ces printf donc dans le while.
    Les while ne sont là que pour parcourir le tableau,trouver l'indice de l'ip correspondant qui se retrouvera ainsi dans i ou j
    je te répète que du coup ton matrice[i][j] en dessous est donc en dehors des bornes d'où crash et coredump. Et comme le printf est bufferisé, et que tu ne fait pas de fflush, ça peut crasher après sans avoir imprimé.. Si tu voulais suivre réellement tu fais fprintf(stderr..) qui flush automatiquement..

    D'autre part ton test dans le while devrait être un && je crois, et non un ||

    Tant que i < n ET strcmp() c'est à dire j'arrête si i == n OU si strcmp() == 0.


    Citation Envoyé par MsTik
    Je ne vois pas pourquoi un printf("\n"); serait plus cohérent qu'un puts("");
    Parce que tu avais mis des printf....

    Citation Envoyé par MsTik
    Et par initialiser les pointeur tu veux dire a NULL ?
    OUI

    Citation Envoyé par MsTik
    Je pensais que le malloc gérait toute l'allocation et donc cette partie .
    il le fait sur le retour, oui. Mais un pointeur déclaré comme ça est pris sur la pile, il peut donc avoir n'importe quelle valeur. Et donc par précautions il vaut mieux l'affecter (sans compter les arguments cités dans un post il y a 1 ou 2 semaines : dès que tu dépasses la taille de la pile en varaibles ou paramètres d'appels (si donc tu as un certain nombre de niveaux de profondeur avec à chaque fois un certain nombre de variables en paramètres) si tu déclares des pointeurs non alloués ils peuvent se "perdre" ....)

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

Discussions similaires

  1. Problème de comparaison de chaines de caractères
    Par nicolas2603 dans le forum VBA Access
    Réponses: 4
    Dernier message: 12/03/2008, 14h04
  2. Problème avec comparaison de chaines de caractères
    Par nemesis00 dans le forum MATLAB
    Réponses: 4
    Dernier message: 01/01/2008, 18h56
  3. Réponses: 2
    Dernier message: 10/05/2006, 15h23
  4. Réponses: 2
    Dernier message: 23/03/2006, 12h39
  5. Réponses: 11
    Dernier message: 22/03/2006, 21h57

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