The problem is even worse than you thought. Your output from REGEXP is actually a cell array of cell arrays of cell arrays of strings! Yeah, three levels! The following uses CELLFUN to get rid of the top two levels, leaving just a cell array of strings:
cellArrayOfStrings = cellfun(@(c) c{1},res);
However, you can also change your call to REGEXP to get rid of one level, and then use VERTCAT:
res = regexp(S,'(d)','tokens','once'); %# Added the 'once' option
cellArrayOfStrings = vertcat(res{:});
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…