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(int maxWordsLength, const char *delimitersArray);
- int main() {
- int delimitersLength = 0, maxWordsLength = 0;
- printf("Введите длину массива разделителей: ");
- scanf("%d", &delimitersLength);
- char delimitersArray[delimitersLength];
- printf("Введите символы-разделители: ");
- // начало считывания символов-разделителей
- int c = EOF;
- for (int i = 0; (c = getchar()) && i <= delimitersLength; i++) {
- delimitersArray[i] = c;
- }
- // конец считывания символов-разделителей
- printf("Введите максимальное количество слов в тексте: ");
- scanf("%d", &maxWordsLength);
- printf("Введите строку\n");
- char *inputStr = readString(maxWordsLength, delimitersArray); // считываем строку
- if ((int) inputStr[0] % 2 == 0 && (int) inputStr[strlen(inputStr) - 1] % 2 == 0) {
- char copyOfInpStr[strlen(inputStr)];
- strcpy(copyOfInpStr, inputStr); // копируем введенную строку, тк strtok разобьет ее на части
- char *p = strtok(inputStr, delimitersArray), *shortestWord = p;
- unsigned int
- shortestWord_len = strlen(p),
- shortestWord_index = 0,
- word_length = strlen(p),
- word_index = 0;
- // начало поиска самого короткого слова
- while ((p = strtok(NULL, delimitersArray))) {
- word_index += word_length + 1;
- word_length = strlen(p);
- if (strlen(p) <= shortestWord_len) {
- shortestWord_len = word_length;
- shortestWord = p;
- shortestWord_index = word_index;
- }
- }
- // конец поиска самого короткого слова
- free(p);
- p = NULL;
- char *firstPart = malloc(CHUNK_SIZE), *secondPart = malloc(CHUNK_SIZE);
- strncpy(firstPart, copyOfInpStr, shortestWord_index - 1); // копируем введенную строку ДО разделителя слева от самого короткого слова
- strncpy(
- secondPart,
- copyOfInpStr + shortestWord_index + shortestWord_len,
- strlen(copyOfInpStr) - shortestWord_index - shortestWord_len
- ); // копируем строку после самого короткого слова
- char *resultString = malloc(strlen(copyOfInpStr)); // + 1, потому что к длине слова надо прибавить разделитель
- strcat(resultString, firstPart); // объединяем результирующую строку с первой частью
- strcat(resultString, secondPart); // объединяем результирующую строку со второй частью
- resultString[strlen(resultString)] = '\0'; // добавляем символ, обозначающий конец строки
- printf("Строка с удаленным самым коротким словом: %s\n", resultString);
- free(firstPart); // очищаем память
- firstPart = NULL;
- free(secondPart);
- secondPart = NULL;
- free(firstPart);
- firstPart = NULL;
- free(resultString);
- resultString = NULL;
- }
- free(inputStr);
- inputStr = NULL;
- return 0;
- }
- char* readString(int maxWordsLength, const char *delimitersArray) {
- unsigned int inputStr_len = CHUNK_SIZE;
- int wordCounter = 0;
- char *pString = malloc(CHUNK_SIZE);
- int c;
- unsigned int i;
- for (i = 0; (c = getchar()) && wordCounter < maxWordsLength; i++) {
- if (c != '\n') { // игнорируем начало строки
- pString[i] = c;
- for (int j = 0; j < strlen(delimitersArray); j++) {
- if (c == delimitersArray[j]) {
- wordCounter++;
- }
- }
- } else { // если на вход поступил символ '\n', то необходимо уменьшить i, чтобы не нарушать порядок
- i--;
- }
- 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