2009-10-02 9 views
5

Czytam K & R; do tej pory dobrze sobie z tym radzę, ale jest coś w funkcji itoa() której nie rozumiem. Tutaj w itoa() mówią, że same odwracają liczby. Na przykład 10 to 01 (odwracają ciąg znaków):Nie rozumiem itoa() w książce 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; 
} 

Nie rozumiem, jak odwrócił tę liczbę. Mimo, że właśnie robimy n % 10 + '0', to jest to następna cyfra, którą 10 następnie 1 zostaje usunięta, a następnie przechodzi do 0 w prawo? Lub nie rozumiem jego logiki?

+4

Używaj interpunkcji i unikaj kolejnych zdań. Bardzo trudno jest przeczytać twoje pytanie. –

+0

Należy zauważyć, że ten kod nie konwertuje niezawodnie INT_MIN. –

+0

@ Jonathan Co można polecić przenośnie dla INT_MIN? Dzięki! – sigjuice

Odpowiedz

12

W pętli do-while ciągnie numery od tyłu (najmniej znacząca cyfra jako pierwsza). Tak więc, jeśli masz numer -123456789, przetwarza on 9, następnie 8, potem 7 itd.

Tak więc, kiedy trafi w terminator o wartości NULL (linia od trzeciej do ostatniej), otrzymasz "987654321 - ", który jest następnie odwrócony.

2

n % 10 daje 0 dla n = 10, więc po pętli, ciąg s zawiera 01.

Naprawiono to połączenie z reverse().

+0

yh, ale co chcę wiedzieć, jak jego numery od tyłu? przez operatora modulus? – user182502

+0

również, jeśli to robi, ponieważ po prostu dostaję resztę zrobiłem matematyki pozostałą jest zawsze po. jest to ostatnia liczba w numerze, ale nie wiem, dlaczego dunno jestem nieco zdezorientowany – user182502

+0

nvm ma to lol było głupie: P – user182502

0

Algorytm określa cyfry od najmniejszej do najbardziej znaczącej kolejności. Ponieważ całkowita liczba cyfr, które zostaną wygenerowane, nie jest znana z góry, nie można określić prawidłowej pozycji, ponieważ są one generowane - najmniej znacząca cyfra będzie na końcu, ale "koniec" nie jest znany. Są więc buforowane w kolejności, w której są obliczane (odwrotnie), a następnie cały łańcuch jest odwracany, aby poprawić kolejność.

Jednym ze sposobów uniknięcia tego jest określenie długości z góry:

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

ale na urządzeniach bez FPU (i niektóre z bardzo prostego FPUs), która może być cięższe zadanie niż odwrócenia strun.