#include <stddef.h>
#include <stdio.h>
#define countof(array) (sizeof(array) / sizeof((array)[0]))
static const char * const a[ ] = { "One" , "Two" , "Three" } ;
static const char * const b[ ] = { "One" , "Two" , "Three" , "Four" , "Five" } ;
static const struct { const char * const * items; size_t length; } ab[ ] =
{
{ a, countof( a) } ,
{ b, countof( b) } ,
} ;
static const char * const c[ ] = { "One" , "Two" , "Three" , NULL } ;
static const char * const d[ ] = { "One" , "Two" , "Three" , "Four" , "Five" , NULL } ;
static const char * const * const cd[ ] = { c, d, NULL } ;
int main( void )
{
puts ( "Using hardcoded lengths:" ) ; for ( size_t i = 0 ; i < countof( ab) ; i++ ) {
for ( size_t j = 0 ; j < ab[ i] .length ; j++ ) {
printf ( "\t %zu: %s\n " , j
, ab
[ i
] .
items [ j
] ) ; }
}
puts ( "Using NULL-terminated arrays:" ) ; for ( const char * const * const * p = cd; * p; p++ ) {
for ( const char * const * q = * p; * q; q++ ) {
}
}
}
I2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNkZWZpbmUgY291bnRvZihhcnJheSkgKHNpemVvZihhcnJheSkgLyBzaXplb2YoKGFycmF5KVswXSkpCgpzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYVtdID0geyAiT25lIiwgIlR3byIsICJUaHJlZSIgfTsKc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJbXSA9IHsgIk9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsICJGaXZlIiB9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCB7IGNvbnN0IGNoYXIgKmNvbnN0ICppdGVtczsgc2l6ZV90IGxlbmd0aDsgfSBhYltdID0KewogICAgeyBhLCBjb3VudG9mKGEpIH0sCiAgICB7IGIsIGNvdW50b2YoYikgfSwKfTsKCnN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjW10gPSB7ICJPbmUiLCAiVHdvIiwgIlRocmVlIiwgTlVMTCB9OwpzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZFtdID0geyAiT25lIiwgIlR3byIsICJUaHJlZSIsICJGb3VyIiwgIkZpdmUiLCBOVUxMIH07CnN0YXRpYyBjb25zdCBjaGFyICpjb25zdCAqY29uc3QgY2RbXSA9IHsgYywgZCwgTlVMTCB9OwoKaW50IG1haW4odm9pZCkKewogICAgcHV0cygiVXNpbmcgaGFyZGNvZGVkIGxlbmd0aHM6Iik7CiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50b2YoYWIpOyBpKyspIHsKICAgICAgICBwcmludGYoIiV6dTpcbiIsIGkpOwogICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYWJbaV0ubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCJcdCV6dTogJXNcbiIsIGosIGFiW2ldLml0ZW1zW2pdKTsKICAgICAgICB9CiAgICB9CiAgICBwdXRzKCJVc2luZyBOVUxMLXRlcm1pbmF0ZWQgYXJyYXlzOiIpOwogICAgZm9yIChjb25zdCBjaGFyICpjb25zdCAqY29uc3QgKnAgPSBjZDsgKnA7IHArKykgewogICAgICAgIHB1dHMoIi0iKTsKICAgICAgICBmb3IgKGNvbnN0IGNoYXIgKmNvbnN0ICpxID0gKnA7ICpxOyBxKyspIHsKICAgICAgICAgICAgcHJpbnRmKCJcdCVzXG4iLCAqcSk7CiAgICAgICAgfQogICAgfQp9Cg==