Chaines de caracteres: caractere NULL

dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 - 4 juil. 2004 à 20:47
HCJarod Messages postés 221 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 11 décembre 2008 - 11 juil. 2004 à 15:31
bonjour,

Je sais que lorsque l'on utilise la fonction: sprintf(), celle ci met automatiquement un caractere NULL a la fin du mot ecris dans la chaine.

J'aimerais savoir si c'est possible comment eviter qu'elle ecrive ce caractere NULL.

ce serait bien utile vu que j'utilse plusieurs fois de qsuite cette fonction pour la meme chaine :alors ca me mets plein decracteres null dedans!

Merci!

6 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
4 juil. 2004 à 20:56
Le probleme ne vient pas de sprintf...
Toute chaine de caracteres doit se terminer par un caractere nul, pour pouvoir etre lues et traiter correctement, sinon tu aurais des caracteres illisible apres ta chaine.

Mets moi ton bout de code ici en me disant précisement ce que tu souhaites faire et je corrige ton code si nécéssaire..

A++ et bonne continuation

Samir
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
4 juil. 2004 à 22:27
Bonjour,

Si tu veux mettre plusieurs chaine à la suite utilise soir strcpy suivit de strcat.
Ou bien pour faire de l'optimiser utilises la fonction bnstrcpy de Brunews que tu trouveras sur ce site pour faire du chainage direct.

Exemple avec bnstrcpy :

char szTest[256];
char *c;

c = bnstrcpy(szTest, "coucou");
c = bnstrcpy(c, " hello");
bnstrcpy(c, " fin");

code de la fonction bnstrcpy :

__inline char* bnstrcpy(char *dst, char *src) // return ptr sur NULL final
{
__asm {
mov eax, dst
mov ecx, src
dec eax
LcpyLoop:
mov dl, [ecx]
inc eax
inc ecx
mov [eax], dl
or dl, dl
jz short LcpyOut
mov dl, [ecx]
inc eax
inc ecx
mov [eax], dl
or dl, dl
jz short LcpyOut
mov dl, [ecx]
inc eax
inc ecx
mov [eax], dl
or dl, dl
jnz short LcpyLoop
LcpyOut:
}
}

@+
Arnotic,
Admin CS, MVP Visual C++
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
4 juil. 2004 à 22:30
Ben sinon tu peux toujours supprimer ce caractere nul avec quelquechose qui doit ressembler à ca :

MaChaine[ strlen(MaChaine)+1 ] = ' ';

Non ?
Glipper
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
4 juil. 2004 à 22:46
Oui mais pour faire du chainage pas pratique ta solution.
Et surtout pas du tout optimisé.

@+
Arnotic,
Admin CS, MVP Visual C++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
7 juil. 2004 à 18:05
Super la fonction bnstrcpy!

Moi en fait , j'utilisais un pointeur qui pointait vers la chaine a remplir et qui avance au fur et a mesure...
Mais je pense que ce serait possible de reculerl e pointeur d'un caractere pur ecraser le caractere NULL...
Mais bnsstrcpy est plus pratique
Merci!! :big)
0
HCJarod Messages postés 221 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 11 décembre 2008 1
11 juil. 2004 à 15:31
je ne pige pas pourquoi le code n'est pas plutot :
__inline char* bnstrcpy(char *dst, char *src) // return ptr sur NULL final
{
__asm {
mov eax, dst
mov ecx, src
dec eax
LcpyLoop:
mov dl, [ecx]
inc eax
inc ecx
mov [eax], dl
or dl, dl
jnz short LcpyLoop
}
}

il y a trois fois la même chose??? mais bon j'ai peut etre louper quelquechose!

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
a+
0
Rejoignez-nous