2012-05-04 20 views
6

Estoy aprendiendo C++ y obtuve el proyecto para enviar un triángulo de pascal a la salida (después de n-filas de cálculo)., Obteniendo resultados como este, almacenado en un "buffer" de stringstreamUsando stringstream para sangrar/centro de salida

1 
1 1 
1 2 1 
1 3 3 1 

Pero lo que quiero es bastante

1 
    1 1 
    1 2 1 
1 3 3 1 

Mi idea era: el cálculo de la diferencia de la última línea y la longitud de la línea actual (sé que la última es la más larga). Luego rellene cada fila usando espacios (la mitad de la diferencia de longitud de línea). Mi problema ahora es:

  • no he tenido cómo funciona getLine, ni cómo podría extraer una específica (-> última) línea de
  • No sé y no podía encontrar la manera de editar uno línea específica en un stringstream

De alguna manera tengo la sensación de que no estoy en la mejor forma de usar stringstream.

Así que esta es una pregunta bastante común: ¿Cómo resolvió este problema y, si es posible, con cadenas de caracteres, cómo?

+1

http://www.cplusplus.com/reference/iostream/manipulators/setw/ eche un vistazo a esto – v01d

+0

Para que quede claro, ¿está calculando los valores usted mismo y la impresión? ¿O los está analizando y luego imprimiendo? – Benj

+0

Los calculo yo mismo, voy a echar un vistazo a setw, parece ser una buena manera :-) – AnatraIlDuck

Respuesta

2

Conocer la sangría de la primera línea , necesitarías saber el número de líneas en la entrada. Por lo tanto, primero debe leer en toda la entrada. Elegí usar un vector para almacenar los valores para la conveniencia de la función miembro .size() que dará el número total de líneas después de leer en todas las entradas.

#include<iostream> 
#include<sstream> 
#include<vector> 
#include<iomanip> // For setw 
using namespace std; 
int main() 
{ 
    stringstream ss; 
    vector<string> lines; 
    string s; 

    //Read all of the lines into a vector 
    while(getline(cin,s)) 
    lines.push_back(s); 

    // setw() - sets the width of the line being output 
    // right - specifies that the output should be right justified 
    for(int i=0,sz=lines.size();i<sz;++i) 
    ss << setw((sz - i) + lines[i].length()) << right << lines[i] << endl; 

    cout << ss.str(); 
    return 0; 
} 

En este ejemplo, estoy usando setw para establecer el ancho de la línea que se justificará a la derecha. El relleno en el lado izquierdo de la cuerda viene dado por (sz - i) donde sz es el número total de líneas e i es la línea actual. Por lo tanto, cada línea subsiguiente tiene 1 espacio menos en el lado izquierdo.

Siguiente Necesito agregar el tamaño original de la línea (líneas [i] .length()), de lo contrario la línea no contendrá un espacio lo suficientemente grande para que la cadena resultante tenga el relleno correcto en la mano izquierda lado.

setw((sz - i) + lines[i].length()) 

Hope this helps!

0

Si tiene acceso al código que escribe la salida inicial, y si se conoce el número de líneas N que está escribiendo, usted podría simplemente hacer:

for(int i = 0; i < N; ++i) { 
    for(int j = 0; j < N - 1 - i; ++j) 
     sstr << " "; // write N - 1 - i spaces, no spaces for i == N. 
    // now write your numbers the way you currently do 
} 
+1

, dudo que funcione cuando N aumenta y entran en juego números de dos dígitos. ¿Lo hará? – nims

+1

@nims Seguro, necesitaría calcular 'ancho = máximo (elija (N, k)% 10' para obtener el número de dígitos, y escriba (N - 1 - i) * espacios en blanco de ancho.Mi punto simplemente era que es más fácil combinar el formato con el cálculo, en lugar de formatear la salida después del cálculo. – TemplateRex

+0

de alguna manera me gustaría más calcular primero los valores y luego formatear la salida ... – AnatraIlDuck

Cuestiones relacionadas