Есть проблемы с вашим кодом.
1 / Как уже упоминалось, вы возвращаете указатель на локально распределенные данные.Когда вы объявляете локальную структуру / массив в функции, пространство для хранения структуры выделяется в стеке и «теряется» при выходе из функции.Таким образом, возвращаемый указатель будет указывать на мусор.
Единственный способ - выделить данные в куче с помощью malloc.
заменить struct sarray say[totaldata];
на
struct sarray *say;
say = (struct sarray *) malloc(totaldata * sizeof(struct sarray));
2 / NULL не является символом.Если вы хотите проверить конец вашей входной строки, замените while(che != 'NULL')
на while(che != '\0')
3 / возвращая & скажем-> данные неверны.Если вы хотите получить всю информацию, просто верните указатель на ваш массив структур (и измените объявление функции).
4 / Отсутствует много проверок работоспособности
5 / почемуу вас есть неиспользуемый параметр в вашем func (totalchar)
6 /, и вы должны переосмыслить свой алгоритм, например, используя scanf, как уже указано.