К сожалению, вы не правы. Массив char не заканчивается автоматически на ноль, это всего лишь побочный эффект от присвоения ему строкового литерала (который имеет автоматический ноль в конце).
char x[] = "ABC"; // size 4, contains A, B, C, \0.
char x[] = {'A','B','C'}; // size 3, contains no terminating null.
Так что короткий ответ - нет, нет способа автоматически завершать массивы с помощью автоматического ввода. Однако есть множество других опций, таких как векторы STL, которые имеют другие средства определения, когда вы достигли конца. В C ++ 0x, вероятно, (IIRC) будет способ инициализировать вектор так, как вам хотелось бы.
НТН.
EDIT
Лично я предпочитаю добавлять лишние 0 в конце массива самостоятельно, но я полагаю, что есть способы обойти это с помощью макросов.
#define ARRAY(...) {__VA_ARGS__, {0}}
и используйте его вот так
struct foo { char* x; char* y; }
struct foo x[] = ARRAY({"abc", "xyz"}, {"def","uvw"});
Я понятия не имею, работает ли это (и у меня нет удобного препроцессора), и, как я уже сказал, лично мне это не нравится. Также требуется, чтобы первый элемент в структуре был чем-то, что может быть присвоено 0, чтобы отметить конец массива.
Конечно, это заставляет вас не забывать оборачивать его в вызов макроса, что почти так же плохо, как заставлять вас помнить о завершении массива.
EDIT:
У меня просто была возможность проверить это, и это работает. Оказывается, что макросы variadic до сих пор только C. Однако некоторые (большинство?) Компиляторы C ++ все равно их поддерживают, быстрый поиск обнаружил g ++ и visual studio. Тем не менее, я бы не одобрил такой подход, я просто добавил его для полноты.