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

Messages postés
2
Date d'inscription
vendredi 31 août 2007
Statut
Membre
Dernière intervention
7 juillet 2010
- - Dernière réponse : 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);
}
}
Afficher la suite 

3 réponses

Messages postés
14
Date d'inscription
vendredi 14 mai 2010
Statut
Membre
Dernière intervention
9 mars 2011
0
Merci
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.
Commenter la réponse de manudiclemente
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
0
Merci
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) ; 
Commenter la réponse de tpoinsot
Messages postés
2
Date d'inscription
vendredi 31 août 2007
Statut
Membre
Dernière intervention
7 juillet 2010
0
Merci
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
Commenter la réponse de Saigonoseme