[c] tableau d'entier en chaine de caratères ???

tableau d'entier en chaine de caratères ??? [c] - Programmation

Marsh Posté le 22-11-2001 à 23:39:44    

Salut!
Voila mon probleme :
J'ai un tableau d'entier qui contient donc des entiers >10 et je souhaites transformer ce tableau en tableau (ou en chaine) de caracteres et pouvoir ainsi retourner une chaine et afficher sous forme : (10,11,12,13...)
 
D'avance merci!

Reply

Marsh Posté le 22-11-2001 à 23:39:44   

Reply

Marsh Posté le 23-11-2001 à 00:01:54    

Ton probleme  n'est pas tres clair !
Une chaine de caractère c'est a peu pres pareil qu'un tableau d'entier sauf que c'est sur un seul octet et ca se finit par \0
Pour afficher en caractères un tableau d'entier tu peus tres bien faire printf(%c,tab[i]) avec boucle ou rajouter un \0 a la fin et faire un printf("%s",tab)

Reply

Marsh Posté le 23-11-2001 à 00:14:41    

En fait, je veux concatener mon tableau d'entier avec une chaine de caracteres pour que le tout soit une chaine de caracteres.
 
Si je copie les entiers dans une chaine un par un, ils sont transformés !

Reply

Marsh Posté le 23-11-2001 à 01:02:30    

mario51 a écrit a écrit :

En fait, je veux concatener mon tableau d'entier avec une chaine de caracteres pour que le tout soit une chaine de caracteres.
 
Si je copie les entiers dans une chaine un par un, ils sont transformés !  




cad?
 
Si tu vois des petits coeurs, ou des petits bonshommes, c'est normal... l'entier 15 est pas equivalent a sa representation ascii hein :-D


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 23-11-2001 à 07:18:19    

en direct, si j'ai bien compris la question... t'as un tableau d'entiers, et tu veux une chaine de caractères de la forme "(XX,Y,ZZZ,...)" avec les élements de ton tableau.
 
char chaine[BEAUCOUP], tmp[UNPEUMOINS];
int tab[PASMALNONPLUS], nb, i;
 
strcpy(chaine, "(" );
for ( i=0 ; i<nb-1 ; i++ )
  strcat(chaine, sprintf(tmp, "%d,", tab[i]));
if ( nb != 0 )
  strcat(chaine, sprintf(tmp, "%d", tab[nb-1]));
strcat(chaine," )" );
 
Alors, maintenant question subsidiaire : comment kon fait si on veut en meme temps pouvoir controler les débordement de chaines ? pour strcpy et strcat, il y a strncpy où l'on précise la taille max de la chaine, mais pour strprint ? kkun a une idée parce que ce serait quand meme plus secure...
 
Mogi.

Reply

Marsh Posté le 23-11-2001 à 07:52:14    

'y sait plus écrire:
 
strcat -> strncat
strcpy -> strncpy
sprintf -> ????
 
(le lecteur aura corrigé de lui-meme :) )
 
Mogi.

Reply

Marsh Posté le 23-11-2001 à 08:38:02    

ok, autant pour moi... sprintf ne renvoie pas le pointeur sur la chaine mais le nb de caractères imprimés...
 
version sans controle de débordement de chaines:
 
char chaine[BEAUCOUP], tmp[UNPEUMOINS];  
int tab[PASMALNONPLUS], nb, i;  
 
strcpy(chaine, "(" );  
for ( i=0 ; i<nb-1 ; i++ )  
  {
    sprintf(tmp, "%d,", tab[i]);
    strcat(chaine, tmp);
  }
if ( nb != 0 )  
  {
    sprintf(tmp, "%d", tab[nb-1]);
    strcat(chaine, tmp);  
  }
strcat(chaine," )" );  
 
version avec controle de débordements de chaines :
 
char chaine[BEAUCOUP];
int tab[PASMALNONPLUS], nb, i;  
 
strcpy(chaine, "(" ); // inutile de se prendre la tete ici...
for ( i=0 ; i<nb-1 ; i++ )  
  snprintf(tampon, BEAUCOUP, "%s%d,", tampon, tab[i]);
if ( nb != 0 )  
  snprintf(tampon, BEAUCOUP, "%s%d)", tampon, tab[nb-1]);
 
Je n'ai pas réussi à savoir dans la doc si snprintf copié forcément un \0 à la fin de la chaine (meme en cas de troncation)... si non, il faut en mettre un avant et limiter les copies à BEAUCOUP-1
 
char chaine[BEAUCOUP];
int tab[PASMALNONPLUS], nb, i;  
 
chaine[BEAUCOUP-1]='\0';
 
strcpy(chaine, "(" ); // inutile de se prendre la tete ici...
for ( i=0 ; i<nb-1 ; i++ )  
  snprintf(tampon, BEAUCOUP-1, "%s%d,", tampon, tab[i]);
if ( nb != 0 )  
  snprintf(tampon, BEAUCOUP-1, "%s%d)", tampon, tab[nb-1]);
 
difficile de faire plus rapide (d'éviter la copie). la seule solution serait de compter les caractères ajoutés à chaque strcat dans la première version et d'en déduire la limite du strncat... bon ok, c'est faisable :)
 
Mogi.

Reply

Marsh Posté le 23-11-2001 à 09:19:34    

Merci les gars!
 
Je test ca et je vous tiens au courant...
 
@+

Reply

Marsh Posté le 23-11-2001 à 09:22:38    

"en direct, si j'ai bien compris la question... t'as un tableau d'entiers, et tu veux une chaine de caractères de la forme "(XX,Y,ZZZ,...)" avec les élements de ton tableau."
 
C'est exactement ca que je veux faire.
Oh fait, dans ton code: tampon, c'est quoi?
Et pour mettre les virgules?

Reply

Marsh Posté le 23-11-2001 à 09:32:42    

Quand je compil, j'ai un warning :
'snprintf' undefined; assuming extern returning int
 
pour le premier snprintf???

Reply

Marsh Posté le 23-11-2001 à 09:32:42   

Reply

Marsh Posté le 23-11-2001 à 09:39:24    

t'as deja fait du C ??
c'est pour tous les snprintf, il reconnait pas alors soit ca existe pas, soit t'as pas inclu le .h ou la lib.

Reply

Marsh Posté le 23-11-2001 à 09:41:06    

essaie _snprintf

Reply

Marsh Posté le 23-11-2001 à 09:41:18    

Godbout a écrit a écrit :

t'as deja fait du C ??
c'est pour tous les snprintf, il reconnait pas alors soit ca existe pas, soit t'as pas inclu le .h ou la lib.  




c'est pas standard snprintf... tous les compilos ne l'ont pas...

Reply

Marsh Posté le 23-11-2001 à 09:44:04    

J'ai essaye la 1ere version :
char chaine[BEAUCOUP], tmp[UNPEUMOINS];  
int tab[PASMALNONPLUS], nb, i;  
 
strcpy(chaine, "(" );  
for ( i=0 ; i<nb-1 ; i++ )  
 {
   sprintf(tmp, "%d,", tab[i]);
   strcat(chaine, tmp);
 }
if ( nb != 0 )  
 {
   sprintf(tmp, "%d", tab[nb-1]);
   strcat(chaine, tmp);  
 }
strcat(chaine," )" );  
 
 
ca compil, mais ca marche pas !!!???
 
HELP !!!

Reply

Marsh Posté le 23-11-2001 à 09:44:20    

BENB a écrit a écrit :

 
c'est pas standard snprintf... tous les compilos ne l'ont pas...  




 
si j'ai dit ca c'est juste "pour le premier sprintf"

Reply

Marsh Posté le 23-11-2001 à 10:05:26    

C'EST BON, CA MARCHE !!!
 
MERCI MOGI ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed