La solution qui me semble la plus simple, la plus légère et la plus rapide est de compter le nombre de caractères non standard (< ' ' ou >'~').
Code : Tout sélectionner
#!/usr/bin/tcc -run
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MACRO_QUI_VA_BIEN(_i, _u, _w, _p, _s) \
_u = 0; \
_i = strlen(_s); \
while ( --_i > -1 ) _u += (_s[_i] < ' ' || _s[_i] > '~'); \
_u >>= 1; \
printf("||%*.*s||\n", _w + _u, _p + _u, _s); \
printf("||%-*.*s||\n", _w + _u, _p + _u, _s)
void main() {
unsigned char *s1 = "01234567890123456789";
unsigned char *s2 = "0éàùç@~!890123456789";
int i, u, w = 22, p = 22;
MACRO_QUI_VA_BIEN(i, u, w, p, s1);
MACRO_QUI_VA_BIEN(i, u, w, p, s2);
puts("-------");
p = 15;
MACRO_QUI_VA_BIEN(i, u, w, p, s1);
MACRO_QUI_VA_BIEN(i, u, w, p, s2);
puts("-------");
w = 19;
MACRO_QUI_VA_BIEN(i, u, w, p, s1);
MACRO_QUI_VA_BIEN(i, u, w, p, s2);
}
Code : Tout sélectionner
|| 01234567890123456789||
||01234567890123456789 ||
|| 0éàùç@~!890123456789||
||0éàùç@~!890123456789 ||
-------
|| 012345678901234||
||012345678901234 ||
|| 0éàùç@~!8901234||
||0éàùç@~!8901234 ||
-------
|| 012345678901234||
||012345678901234 ||
|| 0éàùç@~!8901234||
||0éàùç@~!8901234 ||
avec ncurses
SANS la MACRO_QUI_VA_BIEN, le dossier Téléchargements n'est pas toujours aligné correctement.
AVEC la MACRO_QUI_VA_BIEN, le dossier Téléchargements est aligné correctement dans tous les cas.