Вы можете использовать первую идиому (пользователь выделяет), и если места для строки недостаточно, вы перераспределяете. Это будет работать, если вы и пользователь соглашаетесь использовать одно и то же распределение (например, malloc / free). Это даст вам оптимальную производительность (без распределения для каждой итерации) и все еще удобно для пользователя.
С этой идиомой выделенное хранилище увеличивается по мере необходимости, но пользователь может в любое время выбрать «сокращение» его путем перераспределения меньшего хранилища (которое при необходимости начнет расти снова).