Iterando a través de dígitos en entero en C

Tengo un entero como 1191223 y quiero iterar sobre los dígitos. No estoy seguro de cómo hacer esto en C, ¿hay alguna manera fácil de hacerlo?

Gracias.

¿Hacia adelante o hacia atrás?

Suponiendo un entero positivo:

unsigned int n = 1191223; while (n != 0) { doSomething (n % 10); n /= 10; } 

… trabajará de menor a mayor, o …

EDITAR Me había olvidado por completo de esta solución que no funcionaba que tenía aquí. Tenga en cuenta que Very Smart People ™ parece usar la iteración más pequeña a la más grande de manera consistente (tanto el kernel de Linux como el printf de GLibC, por ejemplo, solo iterar hacia atrás) pero esta es una mala manera de hacerlo si realmente no quiere usar snprintf por alguna razón…

 int left_to_right (unsigned int n) { unsigned int digit = 0; if (0 == n) { doSomething (0); } else { digit = pow(10, 1.0+ floor(log10(n))); while (digit /= 10) { doSomething ( (n / digit) % 10 ); } } } 

Supongo que es muy tonto suponer que tienes log10 y pow pero no snprintf , por lo que sería un plan alternativo

 int left_to_right_fixed_max (unsigned int n) { unsigned int digit = 1000000000; /* make this very big */ unsigned int n10 = 10 * n; if (0 == n) { doSomething (0); } else { while (digit > n10) { digit /= 10; } while (digit /= 10) { doSomething ( (n / digit) % 10 ); } } } 

… o, si realmente no tiene hardware multiplicar / dividir, puede recurrir al uso de una tabla de potencias de diez.

 int left_to_right (unsigned int n) { static const unsigned int digit [] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 /* make this very big */ }; static const unsigned char max_place = 10; /* length of the above array */ unsigned char decimal; unsigned char place; unsigned char significant = 0; /* boolean */ if (0 == n) { doSomething (0); } else { place = max_place; while (place--) { decimal = 0; while (n >= digit[place]) { decimal++; n -= digit[place]; } if (decimal | significant) { doSomething (decimal); significant |= decimal; } } } } 

… que he adaptado de http://www.piclist.com/techref/language/ccpp/convertbase.htm a una versión algo más general.

En lo siguiente supongo que quiere decir dígitos decimales (base 10). Probablemente puedas adaptar las soluciones a otros sistemas de numeración sustituyendo los 10 s.

Tenga en cuenta que la operación de módulo es una cosa difícil en relación con los operandos negativos. Por lo tanto, he elegido el tipo de datos para ser un entero sin signo.

Si desea procesar primero el dígito menos significativo, puede probar el siguiente método no probado:

 uint32_t n = 1191223; do { uint32_t digit = n%10; // do something with digit } while (n/=10); 

Si prefiere recorrer los dígitos a partir del dígito más significativo, podría intentar adaptar el siguiente código no probado:

 uint32_t n = 1191223; #define MAX_DIGITS 10 // log10((double)UINT32_MAX)+1 uint32_t div = pow(10, MAX_DIGITS); // skip the leading zero digits while ( div && !(n/div) ) div/=10; if ( !div ) div = 10; // allow n being zero do { uint32_t digit = (n/div)%10; // do something with digit } while (div/=10); 

Desea iterar sobre la base de 10 dígitos, pero un entero no tiene concepto de notación y dígitos árabes. Convertirlo en una cadena primero:

 int i = 1191223; char buffer[16]; char *j; snprintf(buffer, 16, "%i", i); for ( j = buffer; *j; ++j ) { /* digit is in *j - '0' */ } 

Puedes usar sprintf() para convertirlo en una matriz char , y luego iterar a través de eso, así (sin probar, solo para que comiences):

 int a = 1191223; char arr[16]; int rc = sprintf(arr, "%d", a); if (rc < 0) { // error } for (int i = 0; i < rc; i++) { printf("digit %d = %d\n", i, arr[i]); } 
 void access_digits(int n) { int digit; if (n < 0) n = -n; do { digit = n % 10; /* Here you can do whatever you want to do with the digit */ } while ((n/=10) > 0); } 

Algo como esto:

 char data[128]; int digits = 1191223; sprintf(data, "%d", digits); int length = strlen(data); for(int i = 0; i < length; i++) { // iterate through each character representing a digit } 

Tenga en cuenta que si usa un número octal como 0100 , también necesita cambiar el sprintf(data, "%d", digits); a sprintf(data, "%o", digits); .

Una forma pirata es convertir esto en cadena (ver strtol) y luego reconvertirlo en un número. Podrías usar algo como el character you want - '0'

En la parte superior de mi cabeza: “i% 100000”, “i% 100000”, …

Una solución recursiva le permitiría comenzar desde “i% 10”.