¿Cómo puedo organizar correctamente la salida en columnas?
-
19-09-2019 - |
Pregunta
La primera cosa que viene a la mente es hacer un montón de \ t, pero eso haría que las palabras que se mal alineados Si cualquier palabra es más larga que cualquier otra palabra por unos pocos caracteres.
Por ejemplo, me gustaría tener algo como:
Name Last Name Middle initial
Bob Jones M
Joe ReallyLongLastName T
En su lugar, incluyendo sólo los "\ t" 's en mi declaración cout sólo puedo manejar para obtener
Name Last Name Middle initial
Bob Jones M
Joe ReallyLongLastName T
o
Name Last Name Middle initial
Bob Jones M
Joe ReallyLongLastName T
¿Qué más tengo que hacer?
EDIT: Así que tengo que primero que debería contar el ancho máximo de cada columna que desea visualizar, y luego añadir espacios de relleno en consecuencia. Pero, ¿cómo y con qué funciones, puedo ir haciendo esto? Debería simplemente contar el número de caracteres en una cadena y luego ir desde allí?
Solución
std::setw
de <iomanip>
por ejemplo.
using std::cout;
using std::setw;
cout << setw(10) << "This" <<
setw(10) << "is" <<
setw(10) << "a" <<
setw(10) << "test" << '\n';
Salida:
This is a test
Otros consejos
También debe tener en cuenta que los diferentes editores / espectadores muestran texto con diferente tamaño de la pestaña. Por lo tanto el uso de pestañas, texto que parece que va muy bien organizado en un solo espectador puede mirar feo en otro.
Si realmente quiere producir arreglo agradable, se puede utilizar espacios de relleno, y se podía hacer dos pases en el texto: en primer lugar contar el ancho máximo de cada columna, a continuación, agregar la cantidad correcta de espacios de relleno a cada columna. Para este último, también se puede utilizar una llamada hecha a medida printf
.
Actualización: Contando el ancho de la columna, básicamente, significa contar la longitud de las cadenas que tiene en columna dada. Se puede hacer uso de string::length()
o strlen()
, dependiendo de si se está utilizando std::string
o char*
( el primero es recomendado). A continuación, sólo iterar a través de todas las palabras en esa columna, compara la longitud de palabra máximo que tiene hasta ahora, y si la palabra actual es más largo, se establece que la longitud a ser el nuevo máximo. Si almacena las palabras en un contenedor STL, puede incluso utilizar el std::max_element
algoritmo hacer el trabajo para usted con una sola llamada de función.
Utilice el relleno printf()
con el menos bandera para la alineación izquierda
printf("%-8s%-21s%-7s%-6s\n", "Name", "Last Name", "Middle", "initial");
printf("%-8s%-21s%-7s%-6s\n", "Bob", "Jones", "M", "");
printf("%-8s%-21s%-7s%-6s\n", "Joe", "ReallyLongLastName", "T", "");
¿Qué produce:
Name Last Name Middle initial
Bob Jones M
Joe ReallyLongLastName T
En situaciones como ésta típicamente se requieren dos pases: uno para descubrir la anchura máxima de cada columna y otro para hacer la impresión. Para iostreams estándar se puede utilizar la rutina width()
tener la iostream manejar el relleno de forma automática.
formato Uso de cadena (de stdio) para visualizar cada línea.
http://www.cppreference.com/wiki/c/io/printf
Se va a dejar que se establece anchuras mínimas de campo y así se rellenará el resto de cada campo para usted.