tableau d'entier en chaine de caratères ??? [c] - Programmation
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)
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 !
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
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.
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.
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.
Marsh Posté le 23-11-2001 à 09:19:34
Merci les gars!
Je test ca et je vous tiens au courant...
@+
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?
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???
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.
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...
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 !!!
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"
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!