2015-10-03 133 views
2

如何迭代複合文字數組以便我可以打印book_idvalue如何遍歷複合文字數組

#include <stdio.h> 
#include <string.h> 

typedef struct { 
    int book_id; 
    char value; 
} BookCode; 

typedef struct { 
    BookCode *codes; 
} Books; 

int main() { 
    Books MyBooks[] = { 
     (BookCode[]){ {1, 'a'},{2, 'b'} }, 
     (BookCode[]){ {1, 'd'},{2, 'c'}, {3, 'f'} }, 
    }; 

    int i,j; 
    int n1 = sizeof(MyBooks)/sizeof(MyBooks[0]); 
    for(i = 0; i < n1; i++){ 
     printf("%d\n", i); 
     // how to iterate over compound literal array? 
    } 
    return 0; 
} 

回答

2

如何遍歷化合物字面數組?

你不能。

至少在沒有提供關於兩個BookCode陣列攜帶元件的數量,即2和3這以後信息是由兩個數組指派到的指針的類型元素丟失附加信息MyBooks。在運行期間不能再進行計算。

你可以做的是定義一個標記值,並將一個例如阻塞元素的實例添加到每個BookCode數組的末尾。這樣每個數組的大小可以在運行時間內(重新)計算。

例如,這是可以做到如下所示:

#include <stdio.h> 
#include <string.h> 

typedef struct 
{ 
    int book_id; 
    char value; 
} BookCode; 

#define BOOKCODE_STOPPER {-1, '\0'} 
static const BookCode BookCodeStopper = BOOKCODE_STOPPER; 

typedef struct 
{ 
    BookCode *codes; 
} Books; 

size_t get_codes_count(Books * books) 
{ 
    BookCode * bc = books->codes; 

    while (bc->book_id != BookCodeStopper.book_id 
     && bc->value != BookCodeStopper.value) 
    /* doing "while (memcmp(bc, &BookCodeStopper, sizeof BookCodeStopper)" might be faster. */ 
    { 
    ++bc; 
    } 

    return bc - books->codes; 
} 

int main(void) 
{ 
    Books books[] = { 
    {(BookCode[]) {{1, 'a'}, {2, 'b'}, BOOKCODE_STOPPER}}, 
    {(BookCode[]) {{1, 'd'}, {2, 'c'}, {3, 'f'}, BOOKCODE_STOPPER}} 
    }; 

    size_t n1 = sizeof books/sizeof books[0]; 
    for (size_t i = 0; i < n1; ++i) 
    { 
    printf("%zu\n", i); 

    size_t s = get_codes_count(books + i); 
    for (size_t j = 0; j < s; ++j) 
    { 
     printf("Book code %zu: id=%d, value=%c\n", j, books[i].codes[j].book_id, 
      books[i].codes[j].value); 
    } 
    } 

    return 0; 
} 

這種方法意味着的書碼至少一個可能的組合會不會出現。在上面的例子中,我爲此選擇了{-1, '\0'}

+0

添加組合應該這樣做。謝謝 – user1024718