Bonjour,
J'aimerais pouvoir rapidement convertir une chaine "toto" sur 20 caractères par exemple.
Je sais le faire pour un nombre avec sprintf et les %20d ou %20f mais j'aurais tendance à faire un truc bien compliqué pour une chaine...
Merci.
Version imprimable
Bonjour,
J'aimerais pouvoir rapidement convertir une chaine "toto" sur 20 caractères par exemple.
Je sais le faire pour un nombre avec sprintf et les %20d ou %20f mais j'aurais tendance à faire un truc bien compliqué pour une chaine...
Merci.
salut,
si tu sais le faire avec sprintf tu sais aussi le faire avec une CString (fonction format ) voir faq.
Le problème c'est qu'en entrée, j'ai un char* et pareil en sortie.
Passer par CString va m'obliger à faire plusieurs conversions et j'ai besoin d'être rapide car il y a plusieurs chaines à formater.
ça suffit ...Code:
1
2 sprintf(sz,"%20s","toto");
Ah oui, mince, j'étais vraiment à l'ouest...
Le problème, c'est que "%20s" n'a pas le même comportement partout.
Je ne sais pas quel comportement est standard, mais certaines implémentations considèrent 20 comme une longueur minimale, d'autres comme une taille maximale...
Pour moi, la méthode memcpy est la plus sûre:
Et bien sûr, tu peux en faire une fonction:Code:
1
2
3
4
5
6
7
8 char buf[20+1]; size_t len = strlen(chn); len = min(len,20); //Copie sans le \0 memcpy(buf, chaine, len*sizeof(buf[0])); for(size_t i=len ; i<20 ; i++) buf[i] = ' '; buf[20] = '\0';
Voire même un template:Code:void StrCpyEx(char *buf, size_t taille, char const *chaine, char padding);
Code:
1
2
3
4
5 template< size_t N > void StrCpyExT(char (&buf)[N], char const *chaine, char padding) { StrCpyEx(buf, N, chaine, padding); }