Dani ha scritto:
La mia era una domanda
In pratica ho il tuo stesso problema, solo che in un programma C. Per sostituire una frase sempre sulla stessa riga la faccio precedere da un "\r", ma se la stringa precedentemente stampata è piu' lunga di quella da stampare restano i vecchi caratteri sul terminale.
Ho risolto, se così si puo' dire, stampando un numero di spazi che corrispondono alla lunghezza della penultima stringa meno la lunghezza dell'ultima.
Questa soluzione è noiosa e poco elegante, mi chiedevo se ci fosse qualche alternativa migliore
Mario Vanoni ha scritto:
printf("due%10s\n", ""); /* se non bastano 10, mettine di piu` */
Il problema è proprio quel "se non bastano" ! Durante l'esecuzione del programma l'accertarsi di questo rappresenta solo una noia in piu'.
Inoltre su terminali piccoli stampando troppi spazi si rischia di andare a capo, con conseguente "annullamento" del '\r'. In pratica la seconda stringa verrebbe stampata sulla nuova riga !
Se vuoi la soluzione ottimale per tutti gli schermi
e` fattibile, pero` vedi i problemi alla fine.
zzz.c
gcc -o zzz zzz.c
Questo funziona perfettamente se, qui il problema, fai prima
export COLUMNS
zzz
RATIONALE:
COLUMNS non viene esportato perche' il suo valore dipende
dalla grandezza dello schermo (X) che puo` variare.
set | less ti fa vedere COLUMNS,
env | less invece no.
Per farlo perfetto devi usare ioctls(2), qui pero` ignoro,
pare che SIGWINCH cambi se la dimensione del terminale cambia.
Altra sorgente di informazione forse e2fsck,
con computer diversi, 128 e 160 colonne,
la percentuale e` sempre verso fondo riga.
EDIT:
Pensando ai terminale vt200 di anni fa,
cols - str - 2
quelli non sopportavano un \n alla colonna 79/80.
EDIT2:
Il cast (int) strlen
perche' strlen ritorna size_t