Giustifica a destra l'output in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::right e std::setw per giustificare l’output a destra in C++
  2. Usa la funzione printf per giustificare a destra l’output in C++
Giustifica a destra l'output in C++

Questo articolo illustrerà più metodi su come giustificare a destra il flusso di output in C++.

Usa std::right e std::setw per giustificare l’output a destra in C++

La libreria standard C++ fornisce funzioni di supporto del manipolatore I/O per controllare meglio i flussi quando viene utilizzata con gli operatori << >> e sono incluse nel file di intestazione <iomanip>. std::right è uno dei manipolatori di flusso che imposta la posizione dei caratteri di riempimento. Quindi dovrebbe essere usato insieme alla funzione di manipolazione std::setw, che è usata per impostare la larghezza del flusso. std::setw accetta un singolo intero come argomento per specificare il numero di caratteri da allocare per la larghezza del flusso.

Nel prossimo codice di esempio, inizializziamo un vettore di double con valori arbitrari che hanno una precisione diversa e poi li mostriamo tutti come giustificato sul lato destro della console.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    cout << right << setw(20) << fixed << i << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

  123.231000
    2.234300
    0.324000
    0.012000
   26.949109
11013.000000
   92.001112
    0.000000

Usa la funzione printf per giustificare a destra l’output in C++

Un’altra potente funzione per gestire la formattazione I/O è printf. Anche se printf non è usato con i flussi cin / cout, può formattare separatamente gli argomenti delle variabili. Nota che usiamo l’identificatore di formato %f per i valori in virgola mobile, e usiamo un numero arbitrario 20 per aggiungere caratteri di riempimento a ciascun elemento. Di conseguenza, ogni linea è larga 20 caratteri e poiché il numero è positivo, i caratteri di riempimento vengono aggiunti da sinistra.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    printf("%20f\n", i);
  }

  return EXIT_SUCCESS;
}

Produzione:

  123.231000
    2.234300
    0.324000
    0.012000
   26.949109
11013.000000
   92.001112
    0.000000

In alternativa, possiamo inserire un numero intero negativo nell’identificatore di formato per riempire i caratteri sul lato destro, giustificando l’output a sinistra. Un’altra potente caratteristica di printf è formattare valori di stringa letterali, come dimostrato nel seguente codice di esempio. Nota che %c è l’identificatore di formato char e il valore 0x20 è esadecimale per un carattere spazio.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    printf("%-20f\n", i);
  }

  printf("%60s\n", "this ought to be justified right");
  printf("%-20s|%20c|%20s\n", "wandering", 0x20, "the tower");

  return EXIT_SUCCESS;
}

Produzione:

123.231000          
2.234300            
0.324000            
0.012000            
26.949109           
11013.000000      
92.001112           
0.000000            
                            this ought to be justified right

wandering           |                    |           the tower
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ IO