Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <locale.h>
- #include <string.h>
- #include <stdlib.h>
- int count_strok, count_razdelit, max_count_symb, count_numbers_razdelit, kol_str;
- char **base_text;
- char *result;
- char *razdeliteli;
- int num_razdel[1000];
- void init()
- {
- printf("Введите количество строк\n");
- scanf("%d%*c", &count_strok);
- printf("Введите текст\n");
- base_text = (char **)malloc((count_strok+1)*sizeof(char *));
- int i;
- i=1;
- //вводим текст
- for (i=1; i<=count_strok; i++)
- {
- base_text[i] = (char *) malloc(256*sizeof(char));
- fgets(base_text[i], 256, stdin);// максимум 256 символов
- base_text[i] = (char *) realloc(base_text[i], strlen(&base_text[i][0])*sizeof(char));
- }
- printf("Введите количество разделителей\n");
- // Вводим разделители, пока не встретится повторающийся
- scanf("%d%*c", &count_razdelit);
- count_razdelit++;
- printf("Введите разделители\n");
- razdeliteli=(char*)malloc((count_razdelit+1)*sizeof(char));
- fgets(razdeliteli, 256, stdin);
- printf("Введите максимальное количество символов в строке\n");
- scanf("%d", &max_count_symb);
- }
- void compress()
- {
- result = (char *)malloc(5*count_strok*max_count_symb*sizeof(char));
- result[0]='\0';
- int len_result,i;
- len_result=0;
- for (i=1; i<=count_strok; i++)
- {
- strcat(result, base_text[i]);
- len_result += strlen(&base_text[i][0]);
- result[len_result]= '\n';
- result[++len_result]='\0';
- }
- }
- int is_razdelitel(char x)
- {
- int i;
- for (i=0; i<count_razdelit; i++)
- if ( razdeliteli[i] == x)
- return 1;
- return 0;
- }
- void delete_other_razdelit()
- {
- int i;
- for (i=0; i<(int)strlen(&result[0]); i++)
- {
- if ( result[i] == '\n' )
- result[i] = razdeliteli[0];
- if ( is_razdelitel(result[i]) )
- {
- int how =1;
- int x=i+1;
- while ( is_razdelitel(result[x]) )
- {
- how++;
- x++;
- }
- int j=i+how;
- for (j=i+how; j<(int)strlen(&result[0]); j++)
- result[j-how+1] = result[j];
- result[strlen(&result[0])-how+1]='\0';
- }
- }
- result = (char *) realloc(result, strlen(&result[0])*sizeof(char));
- num_razdel[0]=0;
- count_numbers_razdelit=1;
- }
- void find_razdelit()
- {
- int i;
- num_razdel[0]=-1;
- count_numbers_razdelit=1;
- for (i=0; i<(int)strlen(&result[0]); i++)
- {
- if ( is_razdelitel(result[i]))
- {
- num_razdel[count_numbers_razdelit++] = i;
- }
- }
- }
- void divide_text()
- {
- free(base_text);
- base_text = (char**)malloc(sizeof(char*)*count_strok);
- int now_str, last_del;
- now_str=1; last_del=0;
- num_razdel[count_numbers_razdelit++] = strlen(&result[0]);
- char *tmp;
- tmp=(char*)malloc( max_count_symb*sizeof(char));
- int i;
- for (i=0; i<count_numbers_razdelit; i++)
- {
- base_text[now_str] = (char *) malloc(max_count_symb*sizeof(char)); // Выделяем память для строки
- base_text[now_str][0] = '\0';
- // Добавляем слова, пока хватает строки
- while ( (i<count_numbers_razdelit-1) && (num_razdel[i] - num_razdel[last_del] <= max_count_symb))
- i++;
- if ( num_razdel[i] - num_razdel[last_del] > max_count_symb)
- i--;
- if ( i<= last_del)
- {
- printf("Невозможно составить текст, т.к. слово больше строки");
- exit(0);//Выходим из программы
- }
- // Добавляем в строку
- tmp = (char *)realloc( tmp, (num_razdel[i] - num_razdel[last_del]+1)*sizeof(char));
- tmp[0]='\0';
- strncpy(tmp, &result[num_razdel[last_del]+1],num_razdel[i] - num_razdel[last_del]);
- tmp[num_razdel[i] - num_razdel[last_del]]='\0';
- strcat(base_text[now_str], tmp);
- base_text[now_str][strlen(&tmp[0])]='\0';
- now_str++;
- last_del = i;
- }
- free(result);
- kol_str = now_str;
- }
- void print()
- {
- printf("Сформированный текст:\n");
- int i;
- for (i=1; i<kol_str; i++)
- {
- printf("%s\n", base_text[i]);
- free(base_text[i]);
- }
- }
- int main()
- {
- setlocale(LC_CTYPE,"Russian");
- init(); // Ввод
- compress();// Сжимаем весь текст в одну строку
- delete_other_razdelit();// Удаляем лишние разделители
- find_razdelit();// Находим номера разделителей в строке
- divide_text();//Разделяем текст на строки с указанным количеством символов
- print(); //Выводим текст
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment