Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- const unsigned int MAX_LENGTH = 1 * 1024 * 1024; // Не выделять больше мегабайта памяти
- const unsigned int CHUNK_SIZE = 1024; // Выделять блоками по килобайту
- char* readString(const char *delimitersArray);
- char* readSpecialString();
- int main() {
- int delimitersLength = 0, c = EOF;
- char *specialString = NULL, *inputStr = NULL;
- printf("Введите длину массива разделителей: \n");
- scanf("%d", &delimitersLength);
- char delimitersArray[delimitersLength];
- printf("Введите символы-разделители: \n");
- // начало считывания символов-разделителей
- for (int i = 0; (c = getchar()) && i < delimitersLength; i++) {
- if (c != '\n') {
- delimitersArray[i] = c;
- } else {
- i--;
- }
- }
- // конец считывания символов-разделителей
- printf("Введите специальное слово\n");
- specialString = readSpecialString(); // считываем специальное слово
- printf("Введите строку\n");
- inputStr = readString(delimitersArray); // считываем строку
- int delimitersIndexInString[delimitersLength],
- counterFoundedDelimiters = 0,
- firstDelimiterIndex = (int) strlen(inputStr);
- for (int i = 0; i < delimitersLength; i++) {
- char *ach = strchr(inputStr, delimitersArray[i]);
- if (ach == NULL) {
- printf("Не все разделители имеются в тексте\n");
- break;
- } else {
- counterFoundedDelimiters++;
- delimitersIndexInString[i] = ach - inputStr; // записываем индекс первого вхождения разделителя
- if (delimitersIndexInString[i] <= firstDelimiterIndex) {
- firstDelimiterIndex = delimitersIndexInString[i];
- }
- }
- }
- if (counterFoundedDelimiters == delimitersLength) {
- char *firstPart = malloc(CHUNK_SIZE), *secondPart = malloc(CHUNK_SIZE);
- strncpy(firstPart, inputStr, firstDelimiterIndex + 1); // копируем первое слово
- strncpy(secondPart,
- inputStr + firstDelimiterIndex + 1,
- strlen(inputStr) - (firstDelimiterIndex + 1)); // копируем остальную часть строки
- char *finalString = malloc(strlen(inputStr) + strlen(specialString) + 1); // выделяем память размером исходная_строка + размер специального слова + 1 (под разделитель)
- strcat(finalString, firstPart); // добавляем в финальную строку первое слово
- char randomDelimiter = delimitersArray[random() % delimitersLength]; // берем случайный разделитель
- specialString = realloc(specialString, strlen(specialString) + 1); // на всякий случай выделяем память под разделитель
- specialString[strlen(specialString)] = randomDelimiter; // добавляем случайный разделитель к специальному слову
- strcat(finalString, specialString); // добавляем в финальную строку специальный символ с разделителем
- strcat(finalString, secondPart); // добавляем в финальную строку остальную часть
- printf("Итоговая строка: \"%s\"", finalString);
- free(firstPart);
- firstPart = NULL;
- free(secondPart);
- secondPart = NULL;
- free(finalString);
- finalString = NULL;
- }
- free(inputStr);
- inputStr = NULL;
- free(specialString);
- specialString = NULL;
- return 0;
- }
- char* readString(const char *delimitersArray) {
- unsigned int inputStr_len = CHUNK_SIZE;
- char *pString = malloc(CHUNK_SIZE), vowels[10] = {'A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u'};
- int charCounter = 0; // счетчик букв, входящих в одно слово (до разделителя)
- int numberOfVowels = 0;
- int isConditionFulfilled = 0;
- int c;
- unsigned int i;
- for (i = 0; (c = getchar()); i++) {
- if (c != '\n') { // игнорируем начало строки
- pString[i] = c;
- charCounter++;
- for (int g = 0; g < strlen(vowels); g++) {
- if (c == vowels[g]) {
- numberOfVowels++;
- }
- }
- for (int j = 0; j < strlen(delimitersArray); j++) {
- if (c == delimitersArray[j]) {
- charCounter--;
- if (charCounter == numberOfVowels) {
- isConditionFulfilled = 1;
- break;
- } else {
- numberOfVowels = 0;
- charCounter = 0;
- }
- }
- }
- } else { // если на вход поступил символ '\n', то необходимо уменьшить i, чтобы не нарушать порядок
- i--;
- if (isConditionFulfilled == 1) {
- i++;
- break;
- }
- }
- if (i == MAX_LENGTH) {
- free(pString);
- }
- if (i == inputStr_len) { // Блок заполнен
- inputStr_len = i + CHUNK_SIZE;
- pString = realloc(pString, inputStr_len); // Расширяем блок на ещё один килобайт
- }
- }
- pString[i] = '\0'; // Признак конца строки
- return pString;
- }
- char* readSpecialString() {
- unsigned int inputStr_len = CHUNK_SIZE;
- char *pString = malloc(CHUNK_SIZE);
- int c;
- unsigned int i;
- for (i = 0; (c = getchar()) != '\n'; i++) {
- pString[i] = c;
- if (i == MAX_LENGTH) {
- free(pString);
- }
- if (i == inputStr_len) { // Блок заполнен
- inputStr_len = i + CHUNK_SIZE;
- pString = realloc(pString, inputStr_len); // Расширяем блок на ещё один килобайт
- }
- }
- pString[i] = '\0'; // Признак конца строки
- return pString;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement