Сортировка строки без библиотечных строковых функций - C (СИ)
Формулировка задачи:
Помогите, пожалуйста.
Напишите часть кода(сортировку).
Вводим строку.
Нужно отсортировать слова в алфавитном порядке без использования библиотечных строковых функций.
Решение задачи: «Сортировка строки без библиотечных строковых функций»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> size_t strspn(const char* const str, const char* const accept) { size_t count = 0; const char* s = str; const char* a = NULL; while (*s != '\0') { a = accept; while ((*a != '\0') && (*s != *a)) { a++; } if (*a == '\0') { return count; } else { count++; } s++; } return count; } char* strpbrk(const char* const str, const char* const accept) { int found = 0; const char* s = str; const char* a = NULL; while ((*s != '\0') && !found) { a = accept; while ((*a != '\0') && !found) { if (*a == *s) { found = 1; } a++; } if (!found) { s++; } } if (found) { return (char*) s; } else { return NULL; } } void* memscan(const void* const memory, const int chr) { const unsigned char* memoryIterator = memory; unsigned char c = (unsigned char) chr; while (*memoryIterator != c) { memoryIterator++; } return (void*) memoryIterator; } char* strtok(char* s, const char* const delim) { char* token = NULL; static char* old; if (s == NULL) { s = old; } s = s + strspn(s, delim); if (*s == '\0') { old = s; return NULL; } token = s; s = strpbrk(token, delim); if (s == NULL) { old = memscan(token, '\0'); } else { (*s) = '\0'; old = s + 1; } return token; } void* memcpy(void* const dest, const void* const src, const size_t len) { unsigned char* destIterator = dest; unsigned char* srcIterator = src; size_t i = 0; for (i = 0; i < len; i++) { (*destIterator) = (*srcIterator); destIterator++; srcIterator++; } return dest; } size_t strlen(const char* const str) { size_t length = 0; const char* iterator = str; while (*iterator != '\0') { length++; iterator++; } return length; } char* strcpy(char* const dest, const char* const src) { return memcpy(dest, src, strlen(src) + 1); } char* strcat(char* const dest, const char* const src) { strcpy(dest + strlen(dest), src); return dest; } int tolower(const int c) { if ((c >= 65) && (c <= 90)) { return c + 32; } else { return c; } } int strcasecmp(const char* const s1, const char* const s2) { int result = 0; const unsigned char* p1 = (const unsigned char*) s1; const unsigned char* p2 = (const unsigned char*) s2; if (p1 != p2) { while ((result == 0) && (*p1 != '\0')) { result = tolower(*p1) - tolower(*p2); p1++; p2++; } } return result; } void AnalyzeString(const char* const str, size_t* const wordsCountPtr, size_t* const maxWordLengthPtr) { const char* iterator = str; size_t wordCount = 0; size_t maxLength = 0; size_t length = 0; while (*iterator != '\0') { if (*iterator != ' ') { length++; } else if (*iterator == ' ') { if (length > maxLength) { maxLength = length; } length = 0; wordCount++; } if (*(iterator + 1) == '\0') { if (length > maxLength) { maxLength = length; } length = 0; wordCount++; } iterator++; } (*wordsCountPtr) = wordCount; (*maxWordLengthPtr) = maxLength; } void TokenizeString(char* const str, char** const tokensArray) { size_t i = 0; char* token = strtok(str, " "); while (token != NULL) { strcpy(tokensArray[i], token); i++; token = strtok(NULL, " "); } } void FreeAndNullTokens(char*** const tokensArrayPtr, const size_t tokensCount) { char** temp = *tokensArrayPtr; size_t i = 0; if (temp != NULL) { for (i = 0; i < tokensCount; i++) { free(temp[i]); temp[i] = NULL; } free(temp); temp = NULL; } } char** AllocateTokensArray(const size_t tokensCount, const size_t tokenLength) { char** tokensArray = NULL; size_t i = 0; int allocSuccessful = 0; tokensArray = malloc(tokensCount * sizeof(*tokensArray)); if (tokensArray != NULL) { allocSuccessful = 1; i = 0; while ((i < tokensCount) && allocSuccessful) { tokensArray[i] = malloc((tokenLength + 1) * sizeof(**tokensArray)); if (tokensArray[i] == NULL) { allocSuccessful = 0; } i++; } if (!allocSuccessful) { FreeAndNullTokens(&tokensArray, tokensCount); } } return tokensArray; } int SortTokens(char** tokensArray, const size_t N, const size_t itemLength) { char* tempToken = NULL; size_t i = 0; size_t j = 0; tempToken = malloc((itemLength + 1) * sizeof(*tempToken)); if (tempToken == NULL) { return 0; } for (j = 0; j < N - 1; j++) { for (i = 0; i < N - 1; i++) { if (strcasecmp(tokensArray[i], tokensArray[i + 1]) > 0) { strcpy(tempToken, tokensArray[i]); strcpy(tokensArray[i], tokensArray[i + 1]); strcpy(tokensArray[i + 1], tempToken); } } } free(tempToken); return 1; } void ImplodeTokens(const char** const tokensArray, const size_t tokensCount, char separator, char* const str) { size_t i = 0; str[0] = '\0'; for (i = 0; i < tokensCount - 1; i++) { strcat(str, tokensArray[i]); str[strlen(str) + 1] = '\0'; str[strlen(str)] = separator; } strcat(str, tokensArray[tokensCount - 1]); } void SortWordsInString(char* const str) { size_t wordsCount = 0; size_t maxWordLength = 0; char** tokensArray = NULL; AnalyzeString(str, &wordsCount, &maxWordLength); tokensArray = AllocateTokensArray(wordsCount, maxWordLength); TokenizeString(str, tokensArray); if (SortTokens(tokensArray, wordsCount, maxWordLength)) { ImplodeTokens(tokensArray, wordsCount, ' ', str); } FreeAndNullTokens(&tokensArray, wordsCount); } int main(void) { char s[] = "This is a test string for strtok!"; printf("'%s'\n --> \n", s); SortWordsInString(s); printf("'%s'\n", s); return 0; }
Объяснение кода листинга программы
- В данной реализации функции
strspn
используется для определения количества пробежных символов в строке. - Функция
strpbrk
используется для поиска первого символа, не являющегося пробелом, в строке. - Функция
memscan
используется для поиска первого вхождения символа в строке. - Функция
strtok
используется для разделения строки на токены. - Функция
memcpy
используется для копирования строки. - Функция
strlen
используется для определения длины строки. - Функция
strcpy
используется для копирования строки. - Функция
strcat
используется для добавления строки к другой строке. - Функция
tolower
используется для преобразования символа в нижний регистр. - Функция
strcasecmp
используется для сравнения строк без учета регистра. - В функции
AnalyzeString
анализируется входная строка, определяются количество слов и максимальная длина слова. - В функции
TokenizeString
строка разделяется на слова, которые сохраняются в массиве указателей на строки. - В функции
FreeAndNullTokens
освобождается память, выделенная под массив указателей на строки, и обнуляется указатель на этот массив. - В функции
AllocateTokensArray
выделяется память под массив указателей на строки и сами строки. - В функции
SortTokens
сортируются слова в массиве указателей на строки. - В функции
ImplodeTokens
массив указателей на строки объединяется в одну строку с использованием указанного разделителя. - В функции
SortWordsInString
сортируются слова в входной строке. - В функции
main
проводится тестирование функцииSortWordsInString
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д