Imprima un número en c dígito por dígito

tengo el numero 5678

Quiero mostrar el número como abajo

 5678 678 78 8 

¿Cómo puedo hacer en c?

he hecho esto

 int n = 5678; for(int i=n; i >= 1; --i) { for(int j=1; j <= i; ++j) { print("%d",j); } print("\n") } 

Primero “stringifique” el int, luego puede usar un puntero de cadena para esto:

 int main() { int n = 5678; char *str_p, str[10];//declare a char pointer, and an array of 10 chars sprintf(str, "%d", n);//initializes str to {'5','6','7','8','\0'} str_p = &str[0];//init pointer to start of string, str_p = str; works, too while(*str_p != '\0') {//while pointer doesn't point to end of string: printf("%s\n", str_p);//print string str_p points to str_p++;//shift pointer, to point to next char in string } return 0; } 

La salida resultante, como se puede ver en este teclado es:

 5678 678 78 8 

Muy fácil, de verdad.
El truco es str_p++ . Al principio, cuando estaba aprendiendo sobre punteros, encontré esto bastante confuso. Pero en realidad es bastante simple. Piense en un puntero como esa cosa cuadrada de plástico rojo en un calendario: lo desliza sobre cualquier fecha que sea ese día:

 MAY: _____________________________ | | | | | |___| | | 1 | 2 | 3 | 4 | 5 ||6|| 7 | |___|___|___|___|___|---|___| 

Esto significa que es el seis de mayo. Correcto, si traducimos esto a un puntero + array en C tendríamos algo como:

 int may[31] = {1,2,3,4,5,6,7,8,9,...}; int *today = &may[5];//zero indexed 

La acción de deslizar la cosa del cuadrado rojo al día siguiente (hoy + 1 == mañana) se escribe, lógicamente, así:

 today++;//or today += 1 

Esto es para decir:

  today + 1: [] =>[]//shift the red square-thingy _____________________________ | | | | | | |___| | 1 | 2 | 3 | 4 | 5 | 6 ||7|| |___|___|___|___|___|___|---| 

Así que si yo fuera a escribir:

 today--; 

se aplica la misma lógica, y hoy se remonta a 6 … ve a la tienda, compra uno de estos calendarios si sientes la necesidad de visualizar esto …
Supongamos que desea cambiar el valor al que apunta un puntero? Bueno, siguiendo la misma analogía (de un control deslizante sobre algún valor), tendría que usar su única mano para mantener ese control deslizante en su lugar, y con la otra mano, puede trabajar en lo que está debajo de él. En su código, esto se refleja en el operador de inderección * . Piense en ello como un alfiler, para mantener el puntero en su lugar mientras trabaja en lo que apunta a:

 (*today)++;//or *today++;, both operators have the same precedence 

Realmente, realmente, realmente es así de simple … Bueno, no, no lo es 🙂 pero 9/10 veces usas punteros, esta forma de pensar funciona

BTW: utilizando str_p = str; es, creo que es más lógico y un poco más eficiente, pero el comstackdor probablemente optimice ambas afirmaciones para la misma cosa. Todavía hay otro teclado, para probar que ambos hacen lo mismo.

Y ahora, para terminar, un enfoque más genérico, que funcionará con números de longitud variable, asignando dinámicamente la memoria requerida para la cadena y liberándola de nuevo:

 #include  #include  int main() { int i, len, n = 5678; char *str_p = NULL; int digitCount(int in); len = digitCount(n);//how many chars do we need to allocate? str_p = calloc(len, sizeof(char));//allocate string, calloc inits memory to 0 len--;//avoid printing empty string at the end sprintf(str_p, "%d", n);//set string in memory for(i=0;i false) in /= 10; ++count;//add 1 digit to count } return count; } 
 int reversDigits(int num) { int rev_num = 0; while(num > 0) { rev_num = rev_num*10 + num%10; num = num/10; } return rev_num; } int main() { int num=5678; int rev=reversDigits(num); while(rev) { printf("%d "reversDigits(rev)); printf("\n"); rev=rev/10; } }