2011-11-29 30 views
5

Dato una variabile C++ std::string che include caratteri di tabulazione, è possibile determinare la lunghezza di quella stringa come apparirebbe sullo "schermo"? vale a dire:Come determinare la lunghezza (stampata) di una stringa std :: con caratteri di tabulazione espansi?

std::string var = "\t\t\t"; 
std::cout << var.length();   // result: 3 
std::cout << printed_length(var); // result: 3*(# of spaces per tab) 
+0

Suppongo che non ci sia una soluzione multipiattaforma a questo. Non sono sicuro però. Specifica comunque il tuo OS di destinazione. –

+7

La larghezza di una scheda non può essere conosciuta, a meno che tu non sappia esattamente dove viene eseguito il rendering del testo (quindi il renderer conoscerebbe la larghezza di una scheda rispetto a uno spazio) –

+0

@the_drow: Attualmente sto utilizzando MinGW GCC 3.4.5 con MSYS su Windows XP. –

risposta

3

Non facilmente. È impossibile senza una specifica conoscenza dello "schermo" coinvolto (in realtà, il software che guida l'output), perché l'espansione delle schede varia così ampiamente. Ci sono quattro possibilità abbastanza ovvie, basate su espansione fissa contro espansione su un multiplo di qualcosa, e basate su celle di caratteri rispetto ad altre misure fisse (ad esempio, per caratteri proporzionali). Esistono anche "schede intelligenti" con criteri ancora più complessi, in cui l'espansione di una scheda può dipendere da un'altra scheda.

Su una tipica "console" che sarà espansa con 8 celle di carattere. Per far fronte a questo, non dovrai solo contare le schede, ma anche osservare la posizione di ogni scheda nella stringa. Dovrai anche fare alcune ipotesi (o fornire un parametro) sulla posizione dell'inizio della stringa relativa a un punto di tabulazione.

Bottom line: se vuoi fare qualcosa del genere, dovrai farlo da solo, basandoti sulla conoscenza di come verranno espanse le schede sul tuo target.

3

Faremo il presupposto di semplificazione che il testo nella stringa sia l'unico testo su una riga o che inizi su un limite di tabulazione.

Ogni carattere di tabulazione si espanderà su un numero diverso di spazi in base al numero di caratteri precedenti.

expansion_count = n_spaces - (current_count % n_spaces); 
Problemi correlati