Chaines de caracteres: caractere NULL

Signaler
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
-
Messages postés
221
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
11 décembre 2008
-
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

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
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++
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1
Ben sinon tu peux toujours supprimer ce caractere nul avec quelquechose qui doit ressembler à ca :

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

Non ?
Glipper
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Oui mais pour faire du chainage pas pratique ta solution.
Et surtout pas du tout optimisé.

@+
Arnotic,
Admin CS, MVP Visual C++
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
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)
Messages postés
221
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
11 décembre 2008

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+