Matrice de Caractères Programmation en C

Fermé
macmat - 26 avril 2012 à 17:25
 macmat - 27 avril 2012 à 00:15
Bonjour,

Je viens vers vous, car malheureusement je ne trouve pas la solution à mon problème.
Le but final serait de remplir une matrice d'entier à partir de caractères, qui représenteraient les sommets d'un graphe.
Pour cela dans un premier temps, j'aimerais stocker les sommets saisis à partir d'un fichier texte dans une matrice de caractères. Je pourrais ensuite les comparer entre eux afin de connaitre le nombre de sommets différents que contient mon fichier texte.
Le code ci-dessous compile, cependant il n'affiche rien.
Lorsque je remplace les %s par des %c, il compile et affiche quelque chose, mais non ce que je désire. De plus il n'arrive plus à compter le nombre d'arcs contenus dans le fichier texte.
Voici mon code :

#include <stdio.h>
#include <stdlib.h>

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////Allocation dynamique matrice//////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
char **AllocTableau(int nbc)
{
char **tab;
int i;
tab = (char**) calloc(nbc, sizeof(char*));
for (i=0; i<nbc; i++)
{
tab[i] = (char*)calloc(nbc, sizeof(char));
}
return tab;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////Allocation dynamique tableau char///////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
char *taballoc(int nbarc)// cette fonction va permettre d'allouer dynamiquement le tableau de sommets.
{
char *tab;
tab = calloc(nbarc, sizeof (char));
return tab;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////Allocation dynamique tableau int///////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
int *inttaballoc(int nbarc)// cette fonction va permettre d'allouer dynamiquement le tableau de sommets.
{
int *tabb;
tabb = calloc(nbarc, sizeof (int));
return tabb;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////Main/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
char a, b, x, y;
char **tab;
int i, j, nbarc=0, nbsommet=0, c, *tab3;
FILE *fp = fopen("john.txt", "r");
for(j=0; j<50; j++)
{
fscanf(fp, "%s %s %d", &a , &b, &c);
if(a!='-')
{
nbarc++;
}
}
fclose(fp);
tab3 = inttaballoc(nbarc);
tab = AllocTableau(nbarc);
FILE *fpp = fopen("john.txt", "r");
for (i=0; i<nbarc; i++)
{
for(j=0; j<2; j++)
{
fscanf(fpp, "%s %s %d", &x , &y, &c);
strcpy(&tab[j][i], &x);
strcpy(&tab[j][i], &y);
tab3[j] = c;
}
}
fclose(fpp);
for (i=0; i<nbarc; i++)
{
for(j=0; j<2; j++)
{
if(tab[i] != tab[j] && tab[i]!=tab[i+1])
{
nbsommet++;
}
}
}
for(i=0;i<nbarc;i++)
{
for(j=0;j<2;j++)
{
printf("%s ",tab[i][j]);
}
}
printf("%s\n", &a);
printf("nobre d'arc = %d\n", nbarc);
printf("nobre de sommets = %d\n", nbsommet);
system("PAUSE");
return 0;
}

le fichier txt se présente sous la forme suivant :
"john.txt"

E e 8
E a 5
E f 3
a b 9
a c 7
b f 8
...

Merci d'avance pour votre aide

Bien Cordialement

Macmat

A voir également:

1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 26/04/2012 à 21:46
Bonjour,
Il y a un problème important ici :
strcpy(&tab[j][i], &x);    
strcpy(&tab[j][i], &y);

qui devrait être
tab[j][i]=x;
tab[j][i]=y;
seulement comme vous pouvez le constater vous donnez la valeur de x à l'emplacement [j][i] puis vous l'écrasez en lui donnant la valeur de y. y ne devrait-il pas être à i+1 ?

Pensez à utiliser rewind pour revenir au début du fichier plutôt que de le fermer et le réouvrir pour faire la même chose.

Enfin d'après le format du fichier et ce que j'ai compris :
x y c   
------   
E e 8    
E a 5    
E f 3    
a b 9    
a c 7    
b f 8

si le "c" n'est toujours que d'un chiffre vous pouvez directement utiliser un seul tableau de char pour stocker les trois variables :
#include <stdio.h>   
#include <stdlib.h>   

int main(void){   
    int i,nbarc;   
    char t[3],**tab;   
    FILE *f;   
    f=fopen("john.txt","r");   
    if(f){   
        nbarc=0;   
        while(fscanf(f,"%c %c %c\n",&t[0],&t[1],&t[2])!=EOF){   
            if(t[0]!='-') nbarc++;   
            printf("%c %c %c\n",t[0],t[1],t[2]);   
        }   

        tab=malloc(sizeof(char*)*nbarc);   
        if(tab) for(i=0;i<nbarc;i++) {   
            tab[i]=malloc(sizeof(char)*3);   
            if(!tab[i]) exit(1);   
        } else exit(1);   

        rewind(f);   
        /* recup dans tab */   
        for(i=0;i<nbarc;i++){   
            fscanf(f,"%c %c %c\n",&tab[i][0],&tab[i][1],&tab[i][2]);   
            tab[i][2]-='0'; /* pour la convert du chiffre en "int" */   
        }   
        /* affiche tab */   
        for(i=0;i<nbarc;i++)   
            printf("x:%c y:%c c:%d\n",tab[i][0],tab[i][1],tab[i][2]);   

        fclose(f);   

        /* free */   
        for(i=0;i<nbarc;i++)   
            free(tab[i]);   
        free(tab);   
    } else exit(1);   
    return 0;   
}


Ça fait un tab[nbarc][3] où du contenu du fichier
x = tab[i][0] y = tab[i][1] c = tab[i][2]
...
le c en [i][2] étant un chiffre récupéré dans un char est passé en entier avec le -'0' ce qui vous permet de l'utiliser comme si c'était un int. Cependant ça reste limité à la taille du char et si le char fait 8bits au minimum ce qui doit être le cas, l'entier max ne peux dépasser 255 en décimal. Edit : 127, car le tableau de char n'est pas unsigned.
0
Merci beaucoup pour votre aide, qui plus est rapide.
J'ai pu voir mon erreur, je voulais effectivement l'écrire au rang i+1.C'est tout à fait ce vous avez écrit ensuite.
J'aimerais cependant conserver la partie entière des nombres présents dans le fichier et non les considérer comme étant des caractères, car par la suite ils seront modifiés. Je vais donc créer un tableau à une dimension contenant ces valeurs qui sont en quelques sorte des poids d'arc, pour ensuite les mettre en relation avec le tableau de caractères.

Merci
Bonne soirée
Cordialement
Macmat
0