2010-02-01 30 views
5
void printLine(const wchar_t* str, ...) 
{ 
    // have to do something to make it work 
    wchar_t buffer[2048];   
    _snwprintf(buffer, 2047, ????); 
    // work with buffer 
} 

printLine(L"%d", 123); 

tôi đã cố gắngCó thể vượt qua cuộc gọi qua dấu chấm lửng qua trực tiếp không?

va_list vl; 
    va_start(vl,str); 

và những thứ như thế này nhưng tôi đã không tìm thấy một giải pháp.

+0

FWIW từ là 'dấu ba chấm' không phải là 'hình elip'. –

Trả lời

9

Đây là một mã C đơn giản thực hiện việc này, bạn sẽ phải bao gồm stdarg.h để làm việc này.

 
void panic(const char *fmt, ...){ 
    char buf[50]; 

    va_list argptr; /* Set up the variable argument list here */ 

    va_start(argptr, fmt); /* Start up variable arguments */ 

    vsprintf(buf, fmt, argptr); /* print the variable arguments to buffer */ 

    va_end(argptr); /* Signify end of processing of variable arguments */ 

    fprintf(stderr, buf); /* print the message to stderr */ 

    exit(-1); 
} 

Các invocation điển hình sẽ là

 
panic("The file %s was not found\n", file_name); /* assume file_name is "foobar" */ 
/* Output would be: 

The file foobar was not found 

*/ 

Hope this helps, Trân trọng, Tom.

+0

Tôi nghĩ rằng tôi đã cố gắng này nhưng bây giờ nó hoạt động. Cảm ơn rất nhiều. – Totonga

+1

Ví dụ của bạn là nguy hiểm. 'vsprintf' không bảo vệ chống tràn bộ đệm và' fprintf (stderr, buf) 'đang yêu cầu tấn công chuỗi định dạng nếu' buf' chứa các ký tự '%' được nhúng. Bạn nên sử dụng 'vsnprintf' và' fprintf (stderr, "% s", buf) 'hoặc' fputs (buf, stderr) '. – jamesdlin

+1

@Jamesdlin: Đó là một ví dụ, để minh họa mã và ngữ nghĩa, nhưng quan sát của bạn là chính xác ... cảm ơn! :) – t0mm13b

2

Thông thường một cuộc gọi vào một phiên bản biến số của hàm, chấp nhận va_list. Ví dụ: _snwprintf gọi nội bộ _vsnwprintf; hãy thử gọi điều đó.

5

Điều bạn muốn sử dụng là vsprintf nó chấp nhận đối số va_list và có mẫu mã trên MSDN trong liên kết.

EDIT: Bạn nên xem xét _vsnprintf sẽ giúp tránh các vấn đề tràn bộ đệm mà vsprintf sẽ tạo ra một cách vui vẻ.

2

Những người khác đã chỉ cho bạn vprintf -gia đình các chức năng, nhưng điều này cũng (không ngạc nhiên) được trả lời bởi câu hỏi thường gặp của comp.lang.c, nếu bạn muốn tự làm quen với các mục FAQ khác. (Chúng đáng đọc, IMO.)

How can I write a function that takes a format string and a variable number of arguments, like printf, and passes them to printf to do most of the work?

+0

Tôi đã tìm kiếm thời gian tạm biệt và không thể tự mình tìm ra giải pháp. Có thể vì tôi đã tìm kiếm những thứ/từ sai. – Totonga

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