Conversion d'un char[] en char*puis stocké en char*[]

Saigonoseme Messages postés 2 Date d'inscription vendredi 31 août 2007 Statut Membre Dernière intervention 7 juillet 2010 - 6 juil. 2010 à 16:38
Saigonoseme Messages postés 2 Date d'inscription vendredi 31 août 2007 Statut Membre Dernière intervention 7 juillet 2010 - 7 juil. 2010 à 10:27
Bonjour à tous,

J'ai un petit souci de conversion d'une chaîne de caractère dans un tableau de chaînes de caractère !!!(tAgTabTrame). (C'est pas agréable à dire çà !)

Le petit programme suivant (extrait) lit un fichier .csv, il concatène dans un char* (Datatxt) les caractères lus (ch).
Une fois le ';' détecté, il insère Datatxt dans le tableau de char* (tAgTabTrame) à un index (CptData)

Seulement l'affectation

[b]tAgTabTrame[CptData] = Datatxt ;

ne fonctionne pas !

L'affectation suivante : tAgTabTrame[CptData] = "Salut !" fonctionne bien...
et à l'affichage, printf("Datatxt : %s", Datatxt);
affiche correctement ma chaîne !

Est-ce que quelqu'un peut m'aider ! Merci beaucoup, beaucoup d'avance !

Phil


// Extrait du fichier .csv -----------
*CLS\n;
SYSTem:COMMunicate:LAN:TELNet:WMESsage?\n;
MEAS:VOLT:DC?\n;
MEAS:VOLT:AC?\n;
// -----------------------------------
void LectureFichierCSV(void)
{
char *tAgTabTrame[50];
char ligne[2000];
char ch = 'a';
char Datatxt[1000];
bool Next ;
//char * s="TEST";
//ouverture du fichier depuis /harddisk/prgrm/ (QNX)
FILE * fp=fopen("AGI_Database.csv","rb");

// écriture du fichier
if (fp!=NULL)
{
printf("Debut de lecture du fichier Database: \n");
int cptchar 0; int CptData 0 ;
sprintf(Datatxt,"%s", "");

while(fgets(ligne, sizeof ligne, fp) != NULL)
{
cptchar = 0 ;
Next = false ;
do
{
ch = ligne[cptchar++];

if((ch '\n') || (ch '\r'))
break;

if(ch == ';')
{
CptData = CptData + 1;

// La ligne qui pose problème !
tAgTabTrame[CptData] = Datatxt ;


printf("%i : %s\n",CptData, Datatxt);
sprintf(Datatxt,"%s", ""); // réinitialise le char*
Next = true ;
} // Fin du if(ch == ';')
else
sprintf(Datatxt,"%s%c",Datatxt, ch); // concaténation
}// do
while (!Next);
} // While
printf("Nombre de trame lues : %i, CptData);
printf("Fin de lecture du fichier Database: \n");
fclose(fp);
}
}

3 réponses

manudiclemente Messages postés 14 Date d'inscription vendredi 14 mai 2010 Statut Membre Dernière intervention 9 mars 2011
6 juil. 2010 à 19:48
Les char* en C, c'est la misère ^^

En général, pour ce genre de situation, il faut utiliser les fonctions de la bibliothèque <string.h> (ou <cstring> si on est en C++).

Dans ce cas, je pense qu'il faut utiliser la fonction strcpy() mais est-ce que ca va marcher vu que c'est un char** ?

Sinon, puisqu'on est en C++, pourquoi ne pas utiliser les conteneurs de la STL? Un std::vector<char*> me parait plus approprié pour ce genre de tableau!

Lien vers les fonctions de chaines.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
7 juil. 2010 à 09:06
Bonjour,

tu affectes toujours au tableau de pointeur la même adresse! à la fin ils contiennent tous l'adresse de Datatxt qui contient la dernière valeur.

fais plutôt :
tAgTabTrame[CptData] = strdup(Datatxt) ; 
0
Saigonoseme Messages postés 2 Date d'inscription vendredi 31 août 2007 Statut Membre Dernière intervention 7 juillet 2010
7 juil. 2010 à 10:27
Bonjour,

Merci pour vos réponses rapides !
Il y a pleins de possibilité pour écrire ce bout de code (et plus facilement...) mais j'utilise un compilateur C->QNX dont je n'ai que peu de bibliothèques pour le link... donc utilisation de fonction de base C.

Oui, j'ai remarqué hier soir que le problème se situait sur l'adressage de Datatxt (via bidouillage malloc/strcat)

tAgTabTrame[CptData] = strdup(Datatxt) ; fonctionne très bien !
(Je ne connaissais pas ces fonctions dans string.h)
Merci encore à vous deux !

Philippe G
0
Rejoignez-nous