texto stew que numeros imprimir gotoxy dev con como codigo centrar alinear alineado c printf alignment

stew - ¿Cómo puedo alinear un número como este en C?



std:: setw (9)

Necesito alinear una serie de números en C con printf () como este ejemplo:

-------1 -------5 ------50 -----100 ----1000

Por supuesto, hay números entre todos esos, pero no es relevante para el tema en cuestión ... Oh, considere los guiones como espacios, usé guiones para que fuera más fácil entender lo que quiero.

Solo soy capaz de hacer esto:

----1--- ----5--- ----50-- ----100- ----1000

O esto:

---1 ---5 --50 -100 1000

Pero nada de esto es lo que quiero y no puedo lograr lo que se muestra en el primer ejemplo usando solo printf (). ¿Es posible en absoluto?

EDITAR:
Lo siento, tenía prisa y no me expliqué bien ... Mi último ejemplo y todas sus sugerencias (para usar algo como "% 8d") no funcionan porque, aunque el último número es 1000, no funciona. Es necesario que vayas hasta 1000 o incluso 100 o 10 para esa materia.

No importa el número de dígitos que se muestren, solo quiero 4 espacios iniciales como máximo para el número más grande. Digamos que tengo que mostrar los dígitos del 1 al 1000 (A) y del 1 al 100 (B) y uso, para ambos, "% 4d", esta sería la salida:

UN:

---1 .... 1000

Cual es la salida que quiero ...

SEGUNDO:

---1 .... -100

Que no es la salida que quiero, en realidad quiero esto:

--1 ... 100

Pero como dije, no sé la cantidad exacta de números que tengo que imprimir, puede tener 1 dígito, puede tener 2, 3 o más, la función debe estar preparada para todos. Y quiero cuatro espacios iniciales adicionales, pero eso no es tan relevante.

EDIT 2: Parece que lo que quiero, la forma en que lo necesito, no es posible (verifique las respuestas de David Thornley y Blank Xavier y mis comentarios). Gracias por su tiempo a todos.


Buscando esto en mi útil Harbison & Steele ...

Determine el ancho máximo de los campos.

int max_width, value_to_print; max_width = 8; value_to_print = 1000; printf("%*d/n", max_width, value_to_print);

Tenga en cuenta que max_width debe ser del tipo int para trabajar con el asterisco, y tendrá que calcularlo en función de la cantidad de espacio que desee tener. En su caso, deberá calcular el ancho máximo del número más grande y sumar 4.


Entonces, ¿quieres un campo ancho de 8 caracteres con espacios como el relleno? Intente "% 8d". Aquí hay una referencia .

EDITAR : Lo que está tratando de hacer no es algo que pueda ser manejado solo por printf, porque no sabrá cuál es el número más largo que está escribiendo. Deberá calcular el número más grande antes de realizar cualquier impresión, y luego averiguar cuántos dígitos usar como el ancho de su campo. Luego puede usar snprintf o similar para hacer un formato printf en el momento.

char format[20]; snprintf(format, 19, "%%%dd//n", max_length); while (got_output) { printf(format, number); got_output = still_got_output(); }


Intente convertir a una cadena y luego use "% 4.4s" como el especificador de formato. Esto hace que sea un formato de ancho fijo.


Mirando la pregunta editada, necesita encontrar el número de dígitos en el número más alto que se presentará y luego generar el formato printf() usando sprintf() , o usando %*d con el número de dígitos que se pasan como un int para el * y luego el valor. Una vez que tenga el número más grande (y debe determinarlo por adelantado), puede determinar el número de dígitos con un algoritmo de ''logaritmo de enteros'' (¿cuántas veces puede dividir por 10 antes de llegar a cero), o al usar snprintf() con la longitud del búfer de cero, el formato %d y el valor nulo para la cadena; el valor de retorno le indica cuántos caracteres se habrían formateado.

Si no lo sabe y no puede determinar el número máximo antes de su aparición, está sorprendido, no hay nada que pueda hacer.


Por lo que puedo ver en la pregunta, la cantidad de relleno que desea variará según los datos que tenga. En consecuencia, la única solución para esto es escanear los datos antes de imprimir, para averiguar el datum más amplio, y así encontrar un valor de ancho que pueda pasar a printf usando el operador de asterix, por ejemplo

loop over data - get correct padding, put into width printf( "%*d/n", width, datum );


Por qué es printf("%8d/n", intval); no trabajando para ti? Debería...

No mostró las cadenas de formato para ninguno de sus ejemplos "que no funcionan", así que no estoy seguro de qué más decirle.

#include <stdio.h> int main(void) { int i; for (i = 1; i <= 10000; i*=10) { printf("[%8d]/n", i); } return (0); } $ ./printftest [ 1] [ 10] [ 100] [ 1000] [ 10000]

EDIT: respuesta a la aclaración de la pregunta:

#include <math.h> int maxval = 1000; int width = round(1+log(maxval)/log(10)); ... printf("%*d/n", width, intval);

El cálculo de ancho calcula la base de registro 10 + 1, que da el número de dígitos. La fantasía * permite usar la variable para un valor en la cadena de formato.

Aún tienes que saber el máximo para cada ejecución, pero no hay forma de evitarlo en ningún idioma o lápiz y papel.


Si no puede conocer el ancho de antemano, entonces su única respuesta posible dependería de organizar su salida en un búfer temporal de algún tipo. Para informes pequeños, solo sería más sencillo recopilar los datos y aplazar la salida hasta que la entrada esté delimitada.

Para informes grandes, puede requerirse un archivo intermedio si los datos recopilados exceden los límites de memoria razonables.

Una vez que tenga los datos, entonces es sencillo postprocesarlos en un informe utilizando el idioma printf("%*d", width, value) para cada valor.

Alternativamente, si el canal de salida permite el acceso aleatorio, puede seguir adelante y escribir un borrador del informe que asuma un ancho predeterminado (corto), y buscarlo y editarlo cada vez que se viole su suposición de ancho. Esto también supone que puede rellenar las líneas del informe fuera de ese campo de alguna manera inocua, o que está dispuesto a reemplazar la salida hasta ahora por un proceso de lectura-modificación-escritura y abandonar el archivo borrador.

Pero a menos que pueda predecir el ancho correcto de antemano, no será posible hacer lo que quiera sin algún tipo de algoritmo de dos pasos.


printf("%8d/n",1); printf("%8d/n",10); printf("%8d/n",100); printf("%8d/n",1000);


#include<stdio.h> int main() { int i,j,n,b; printf("Enter no of rows "); scanf("%d",&n); b=n; for(i=1;i<=n;++i) { for(j=1;j<=i;j++) { printf("%*d",b,j); b=1; } b=n; b=b-i; printf("/n"); } return 0; }