2013-08-26 22 views
6

trên net: sử dụng printf thêm hai con số (không sử dụng bất kỳ nhà điều hành) như sau:Addition sử dụng printf trong C

main() 
{ 
    printf("Summ = %d",add(10,20)) 
    return 0; 
} 

int add(int x,int y) 
{ 
    return printf("%*d%*d",x,' ',y,' '); 
} 

thể bất cứ ai xin giải thích, cách làm việc này:

return printf("%*d%*d",x,' ',y,' '); 

Note : Điều này không thành công khi tôi gọi "tổng hợp" như sau:

sum(1,1) or sum(3,-1) 
+0

Không biết ... Tại sao điều này không hoạt động cho mỗi và mọi đầu vào ... ví dụ "tổng (1,1)" .. Tôi có cần sửa đổi mã cho mỗi và mọi đầu vào.Nếu đây là trường hợp, thì logic này là sai. – bapi

+0

Tôi đã đi với 'char dummy; trả về snprintf (& dummy, 1, "% * s% * s", x, "", y, ""); 'thay vào đó để tránh đầu ra vô ích. – nneonneo

+0

Hàm của bạn trong mã trên là 'add'. Sau đó, câu hỏi của bạn là về hàm 'sum'. Đó là những chức năng * khác nhau. – abelenky

Trả lời

1

Đầu tiên, printf trả về số ký tự được in.

Thứ hai, trong định dạng số %*d, * có nghĩa là số ký tự tối thiểu cần in, nhưng chiều rộng không phải là từ chuỗi định dạng, mà từ đối số bổ sung.

Với tất cả lại với nhau, công việc được thực hiện, nhưng nó sẽ không hoạt động tốt trên số lượng nhỏ như 1%d trong specifier định dạng, một giải pháp tốt hơn có thể là:

("%*c%*c", a, ' ', b,' '); 
8

Có hai trung tâm các khái niệm tại đây:

  1. printf() trả về số lượng ký tự được in.
  2. Công cụ định dạng %*d định dạng gây ra printf() để đọc hai số nguyên từ đối số của nó và sử dụng giá trị đầu tiên để đặt chiều rộng trường được sử dụng để định dạng số thứ hai (dưới dạng số thập phân).

Vì vậy, có hiệu lực các giá trị đang được thêm được sử dụng làm độ rộng trường và printf() sau đó trả về tổng.

Tôi không chắc chắn về định dạng d thực tế của ký tự khoảng trắng, tại thời điểm này. Điều đó có vẻ kỳ lạ, tôi đã sử dụng một chuỗi rỗng thay thế:

static int sum(unsigned int a, unsigned int b) 
{ 
    return printf("%*s%*s", a, "", b, ""); 
} 

int main(void) 
{ 
    unsigned int a = 13, b = 6; 
    int apb = sum(a, b); 

    printf("%d + %d = %d?\n", a, b, apb); 

    return 0; 
} 

Các công việc trên và tính tổng hợp là 19.

+0

@cHao Chắc chắn rồi, nhưng dĩ nhiên tôi cũng in nó thành một chuỗi, với 's'. Xem mã. Tôi chỉ nghĩ điều này rõ ràng hơn. – unwind

+0

Vâng, đã xem bản cập nhật. Điều đó có ý nghĩa hơn. :) – cHao

+1

Vâng, '''' là một 'int', do đó định dạng'% d' sẽ in '32'. Và vì chiều rộng trường là tối thiểu (có nghĩa là đầu ra sẽ không bị cắt bớt nếu nó lớn hơn chiều rộng được chỉ định), 'add (1,1)' sẽ trả về '4'. Vì vậy, giải pháp của bạn với '% * s' và' "" 'tốt hơn nhiều (mặc dù thủ thuật sẽ không hoạt động với số âm). – Virgile

2

printf trả về số ký tự được in.

Ở đây, nó được sử dụng trong hàm add để tạo chuỗi chỉ bao gồm 10 + 20 dấu cách, bằng cách sử dụng chuỗi định dạng.

Vì vậy, printf trong chức năng add sẽ trả lại 30.

Sau đó, kết quả này chỉ được in bằng printf (mục đích chính của nó).

Lưu ý: có thể hiển nhiên, nhưng tránh sử dụng printf này. Nó rất bẩn vì nó tạo ra các đầu ra vô dụng. Hãy tưởng tượng: add(10000,10000) ...

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