If you know that every element of c has the same number of instances of 'x(...)', i.e., you know extractBetween returns the same size output for each element of c, then it's easy to pre-allocate str:
c = cell(2,1);
c{1} = @(x) 10*x(1)-x(1)^2;
c{2} = @(x) x(1)^2+4*x(2);
num_x = 2; % two x(...) matches in each element of c
str = cell(num_x*numel(c),1); % pre-allocate
for i=1:size(c,1)
str(num_x*(i-1)+(1:num_x)) = extractBetween( func2str(c{i,1}),'x(',')');
end
disp(str);
However, it may be better to do it in a way that handles differing numbers of matches in each element of c and doesn't require pre-allocation because there's no loop:
% make a new element of c with 3 x's:
c{end+1} = @(x) x(1)^2+4*x(2)+10*x(3);
% use cellfun instead of a loop:
str = cellfun(@(x)extractBetween(func2str(x),'x(',')'),c,'UniformOutput',false);
str = vertcat(str{:})