2011-01-26 33 views
10

Làm cách nào để lặp qua một va_list nếu số lượng đối số bổ sung không xác định? Làm thế nào để lặp qua một va_list nếu số lượng đối số không xác định?

#include <stdio.h> 
#include <stdarg.h> 

int add(int x, int y, ...) { 
    va_list intargs; 
    int temp = 0; 

    va_start(intargs, y); 
    int i; 
    for (i = 0; i < 3; i++) { /* How can I loop through any number of args? */ 
     temp += va_arg(intargs, int); 
    } 
    va_end(intargs); 

    return temp + x + y; 
} 

int main() { 
    printf("The total is %d.\n", add(1, 2, 3, 4, 5)); 
    return 0; 
} 
+0

Có thể bạn sẽ cần NULL vào cuối và tìm kiếm điều đó. –

+0

Cảm ơn, đây thực sự là cách tiếp cận mà tôi đang thực hiện. Tôi nghĩ rằng nó dễ dàng hơn việc sử dụng một bộ đếm arg ở đầu cuộc gọi. Nó dễ dàng hơn để đặt một NULL ở cuối. – Bob

Trả lời

14

Sử dụng một giá trị trọng điểm như một terminator, ví dụ NULL hoặc -1

+1

Nếu bạn muốn thêm 0 hoặc số âm? 'va_arg (intargs, int)' sẽ bỏ NULL thành 0. –

+0

Ví dụ: http://www.cplusplus.com/reference/cstdarg/va_end/ – dlchambers

2

Bạn có thể muốn làm điều gì đó như chuyển số tham số làm tham số đầu tiên.

Ví dụ: xem tại đây: http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/

Và nhiều cuộc thảo luận ở đây: http://www.learncpp.com/cpp-tutorial/714-ellipses-and-why-to-avoid-them/

đối số biến thể nguy hiểm nên nếu có thể tôi muốn cố gắng tránh chúng. Việc chuyển loại "vectơ" bao gồm kích thước và con trỏ tới mảng phần tử sẽ an toàn hơn.

+0

Cảm ơn, tôi đang sử dụng ANSI C và tôi không nghĩ có cách nào khác để tránh điều này. – Bob

+0

@Bob: Truyền int * và kích thước của mảng. Các vấn đề với NULL ở cuối là tại một số điểm ai đó sẽ quên nó và nó có thể trở thành một khó khăn để gỡ lỗi lỗi. –

17

Bạn phải ghi rõ số tham số bằng cách nào đó (nếu bạn đang viết mã di động) khi sử dụng danh sách đối số chiều dài thay đổi. Bạn có thể đang nghĩ "Nhưng printf không yêu cầu bạn chỉ ra một số đối số!"

Đúng, tuy nhiên, số có thể được suy ra bằng cách phân tích cú pháp chuỗi định dạng đầu tiên cho% specifier.

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