2009-10-02 14 views
5

Estoy leyendo K & R; hasta ahora estoy bien con eso, pero hay algo en la función itoa() que no entiendo. Aquí en itoa() dicen que invierten los números ellos mismos. Por ejemplo 10 es 01 (invierten la cadena):No entiendo itoa() en el libro de K & R

void itoa(int n, char s[]) 
{ 
    int i, sign; 
    if ((sign = n) < 0) /* record sign */ 
     n = -n; /* make n positive */ 
    i = 0; 
    do { /* generate digits in reverse order */ 
     s[i++] = n % 10 + '0'; /* get next digit */ 
    } while ((n /= 10) > 0); /* delete it */ 
    if (sign < 0) 
     s[i++] = '-'; 
    s[i] = '\0'; 
    reverse(s); 
    return; 
} 

No entiendo cómo se ha invertido el número. A pesar de que solo estamos haciendo n % 10 + '0', entonces es el siguiente dígito, que 10 luego 1 se borra y luego va a 0 ¿verdad? ¿O no entiendo su lógica?

+4

Por favor use la puntuación y evite las oraciones de run-on. Es muy difícil leer tu pregunta. –

+0

Tenga en cuenta que este código no convierte INT_MIN de manera confiable. –

+0

@Jonathan ¿Qué recomendarías para representar INT_MIN de forma portátil? ¡Gracias! – sigjuice

Respuesta

12

En el bucle do-while, está tirando de los números hacia atrás (primero el dígito menos significativo). Entonces, si tenía el número -123456789, procesa el 9, luego el 8, luego el 7, etc.

Entonces, cuando llegue al terminador nulo (tercera a la última línea), tendría "987654321 - ", que luego se invierte.

2

n % 10 da 0 para n = 10, por lo que después del bucle, la cadena s contiene 01.

La llamada a reverse() corrige esto.

+0

yh, pero ¿qué quiero saber cómo está sacando números por detrás? por operador de módulo? – user182502

+0

también si lo hace, ya que solo obtiene el resto, hice los cálculos, el resto siempre está después del. es ese último número en el número, pero no sé por qué no estoy un tanto confundido – user182502

+0

nvm lo tengo jaja era estúpido: P – user182502

0

El algoritmo determina los dígitos de menor a mayor orden. Debido a que el número total de dígitos que se generarán no se conoce de antemano, la posición correcta no puede determinarse a medida que se generan; el dígito menos significativo estará al final, pero el 'final' no se conoce. Por lo tanto, se almacenan en el orden en que se calculan (al revés) y luego se invierte toda la cadena para corregir el orden.

Una forma de evitar esto es para determinar la longitud de antemano:

decimal_digits = (int)log10(n) + 1 ; 

sino en dispositivos sin una FPU (y algunos con muy simple FPU) que es probable que sea una tarea más pesada que la reversión cadena.