Си почему программа обрывается посередине и не выполняет все инструкций из main?
Логика работы: программа считывает посимвольно введенный текст, сохраняя его в динамический массив уникальных предложений.(эта часть программы работает исправно). Затем выводит подсказку и ожидает ввода одной из цифр. После же должна выводить все предложения. Почему-то моя программа пропускает инструкцию scanf, а также пропускает цикл for с печатью предложений, но при этом исправно печатает строку с их кол-вом. Почему так происходит?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wctype.h>
#include <wchar.h>
#include <locale.h>
#define MEM_STEP 5 * sizeof(wchar_t)
struct Text {
struct Sentence **text;
int size;
int n;
};
struct Sentence {
wchar_t *str;
int size;
};
struct Sentence *read_sentence(){
int size = MEM_STEP;
wchar_t *buf = (wchar_t*)malloc(size * sizeof(wchar_t));
wchar_t temp = getwchar();
int n = 0;
do{
if (n >= size - 2 * sizeof(wchar_t)) {
buf = realloc(buf, (size + MEM_STEP) * sizeof(wchar_t));
size += MEM_STEP;
}
buf[n] = temp;
temp = getwchar();
n++;
}while (temp != '.' && temp != '\n');
buf[n] = temp;
buf[n + 1] = '\0';
if (buf[0] == '\n') {
buf++;
}
struct Sentence *sentence = malloc(sizeof(struct Sentence));
sentence->str = buf;
sentence->size = size;
return sentence;
}
int is_sent_unique(struct Sentence** txt, struct Sentence* sent, int n){
for(int i = 0; i < n; i++){
int k = 0;
for(int j = 0; j < wcslen(sent->str); j++){
if (towupper(txt[i]->str[j]) == towupper(sent->str[j]))
k++;
}
if(k == wcslen(sent->str) && k == wcslen(txt[i]->str))
return 0;
}
return 1;
}
struct Text read_text(){
int size = MEM_STEP;
struct Sentence **text = malloc(size * sizeof(struct Sentence*));
struct Sentence *temp;
int n = 0;
int nlcount = 0;
do{
temp = read_sentence();
if (n >= size - 2 * sizeof(struct String*)) {
text = realloc(text, (size + MEM_STEP)* sizeof(struct Sentence *));
size += MEM_STEP;
}
if(temp->str[0] == '\n' && temp->str[1] == '\0'){
nlcount++;
}else{
while (temp->str[0] == '\t' || temp->str[0] == ' ' || temp->str[0] == '\n') {
temp->str++;
}
if (is_sent_unique(text, temp, n)){
text[n] = temp;
n++;
}
nlcount = 0;
}
}while (nlcount < 2);
struct Text txt;
txt.text = text;
txt.size = size;
txt.n = n;
return txt;
}
int main()
{
setlocale(LC_ALL, "");
int func_numb = 0;
puts("Введите текст, по окончании ввода нажмите четыре раза Enter:");
struct Text main_text = read_text();
puts("Введите номер одного из доступных действий:\n1.Для каждого предложения вывести строку-дату вида “ДД-ММ-ГГГГ”, где день - количество слов в предложении, месяц - наибольшая длина слова в предложении, год - общее количество символов в предложении + 1900.\n2.Вывести предложения так, чтобы слова шли в обратном порядке.\n3.Отсортировать предложения по длине первого слова в предложении.\n4.Удалить все предложения у которых все слова имеют длину не больше 3 символов.");
scanf("%d", &func_numb);
switch (func_numb)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
default:
printf("Данные некорректны\n");
}
for (int i = 0; i < main_text.n; i++) {
wprintf(L"%s\n", main_text.text[i]->str);
}
printf("Количество предложений %d", main_text.n);
for (int i = 0; i < main_text.n; i++) {
free(main_text.text[i]);
}
free(main_text.text);
return 0;
}