2009-10-02 34 views
5

Tôi đang đọc K & R; cho đến nay tôi đang làm tốt với nó, nhưng có cái gì đó trong chức năng itoa() mà tôi không hiểu. Ở đây trong itoa() họ nói rằng họ đảo ngược những con số mình. Ví dụ 10 là 01 (họ đảo ngược chuỗi):Tôi không hiểu itoa() trong sách 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; 
} 

Tôi không hiểu nó như thế nào đảo ngược số. Mặc dù chúng tôi chỉ đang thực hiện n % 10 + '0' sau đó chữ số sau của nó mà 10 sau đó 1 bị xóa sau đó nó đi đến 0 phải không? Hoặc tôi không nhận được logic của nó?

+4

Vui lòng sử dụng dấu chấm câu và tránh các câu chạy. Rất khó để đọc câu hỏi của bạn. –

+0

Lưu ý rằng mã này không chuyển đổi INT_MIN đáng tin cậy. –

+0

@Jonathan Bạn muốn giới thiệu tài khoản nào cho INT_MIN một cách hợp lý? Cảm ơn! – sigjuice

Trả lời

12

Trong vòng lặp do-while, nó sẽ kéo các con số ra khỏi phía sau (số ít quan trọng nhất trước tiên). Vì vậy, nếu bạn có số -123456789, nó xử lý số 9, sau đó số 8, sau đó là 7, v.v.

Vì vậy, khi nó chạm vào dấu gạch ngang (thứ 3 đến dòng cuối cùng), bạn sẽ có "987654321 - ", sau đó được đảo ngược.

2

n % 10 cung cấp 0 cho n = 10, vì vậy sau vòng lặp, chuỗi s chứa 01.

Cuộc gọi đến reverse() khắc phục sự cố này.

+0

yh nhưng những gì tôi muốn biết làm thế nào nó kéo số từ phía sau? bởi nhà điều hành modulus? – user182502

+0

cũng nếu nó không lý do tại sao vì nó chỉ nhận được phần còn lại tôi đã làm toán phần còn lại là luôn luôn sau khi. là con số cuối cùng trong số nhưng tôi không biết tại sao dunno i m hơi bối rối – user182502

+0

nvm đã nhận nó lol là ngu ngốc: P – user182502

0

Thuật toán xác định các chữ số từ ít nhất đến thứ tự quan trọng nhất. Bởi vì tổng số chữ số sẽ được tạo ra không được biết trước, vị trí chính xác không thể được xác định khi chúng được tạo ra - chữ số ít quan trọng nhất sẽ ở cuối, nhưng 'kết thúc' không được biết. Vì vậy, chúng được đệm theo thứ tự chúng được tính toán (ngược lại) và sau đó toàn bộ chuỗi được đảo ngược để sửa thứ tự.

Một cách để tránh điều này là để xác định độ dài trước:

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

nhưng trên các thiết bị mà không cần một FPU (và một số với rất đơn giản FPU) mà có thể là một nhiệm vụ nặng hơn chuỗi đảo ngược.

Các vấn đề liên quan