Когда вы говорите «раньше времени», вы имеете в виду во время выполнения или во время компиляции?
Во время компиляции вы делаете это:
char str[1000];
во время выполнения вы делаете это:
char *str = new char[size];
Единственный способ получить точно правильный размер - узнать, сколько символов вы собираетесь прочитать. Если вы читаете из файла, вы можете перейти к ближайшей новой строке (или какому-либо другому условию), а затем точно знать, насколько большим должен быть массив. то есть:
int numChars = computeNeededSpace(someFileHandle);
char *readBuffer = new char[numChars];
fread(someFileHandle, readBuffer, numChars); //probly wrong parameter order
Нет другого способа сделать это. Поставьте себя на перспективу программ. Как узнать, сколько клавиш нажимает пользователь? Лучшее, что вы можете сделать, это ограничить пользователя или что-то еще.
есть некоторые более сложные вещи, такие как создание связанного списка буферов и распределение кусков буферов, а затем их связывание. Но я думаю, что это не тот ответ, который вы хотели здесь.
РЕДАКТИРОВАТЬ: Большинство языков имеют классы string / inputbuffer, которые скрывают это от вас.