Nikita Romanenko
6 years ago
commit
620134c838
3 changed files with 169 additions and 0 deletions
After Width: | Height: | Size: 198 KiB |
@ -0,0 +1,169 @@ |
|||||
|
#include <stdio.h> |
||||
|
#include <stdlib.h> |
||||
|
|
||||
|
// структура объекта подстроки
|
||||
|
typedef struct Substring{ |
||||
|
char *String; |
||||
|
unsigned int Begin; |
||||
|
unsigned int End; |
||||
|
unsigned int Length; |
||||
|
} Substring; |
||||
|
|
||||
|
// коллекция которая хранит в себе набор подстрок
|
||||
|
typedef struct SubstringCollection { |
||||
|
Substring *Collection; |
||||
|
unsigned int Count; |
||||
|
} SubstringCollection; |
||||
|
|
||||
|
// метод для удаления подстроки из коллекции подстрок
|
||||
|
SubstringCollection RemoveFromCollection(SubstringCollection collection, int index) { |
||||
|
for (int i = index; i < collection.Count - 1; i++) { |
||||
|
collection.Collection[i] = collection.Collection[i+1]; |
||||
|
} |
||||
|
collection.Count--; |
||||
|
collection.Collection = realloc(collection.Collection, sizeof(Substring) * (collection.Count + 1)); |
||||
|
return collection; |
||||
|
} |
||||
|
|
||||
|
// проверяем символ, заглавный ли он или нет
|
||||
|
_Bool isCapital(char c) { |
||||
|
if((65 <= c) && (c <= 90)) { |
||||
|
return 1; |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
// возвращает любую часть строки начинающуюся и заканчивающуся на по номеру символа
|
||||
|
char* GetSubstring(char *inputString, unsigned int begin, unsigned int end) { |
||||
|
unsigned int length = end - begin; |
||||
|
char *substring = (char *) calloc(length + 1, sizeof(char)); |
||||
|
for(int i = begin; i != end; i++) { |
||||
|
substring[i - begin] = inputString[i]; |
||||
|
} |
||||
|
substring[length + 1] = '\0'; |
||||
|
return substring; |
||||
|
} |
||||
|
|
||||
|
// удалить русские символы с конца строки (может удалять что-то еще, я хз)
|
||||
|
Substring RemoveRussianSymbolsAtTheEnd(char *string, unsigned int stringLength) { |
||||
|
for(int i = stringLength; i != 0; i--) { |
||||
|
if (string[i] < 0) { |
||||
|
stringLength--; |
||||
|
} |
||||
|
else if (string[i] > 0) |
||||
|
break; |
||||
|
} |
||||
|
Substring result = { GetSubstring(string, 0, stringLength), (unsigned int) 0, stringLength, stringLength}; |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
// проверить строку на наличие в ней скобок различного типа
|
||||
|
_Bool CheckForParentheses(char *string, unsigned int stringLength) { |
||||
|
int parentheses[] = { 40, 41, 60, 62, 91, 93, 123, 125}; |
||||
|
for(int i = 0; i != stringLength; i++) { |
||||
|
for (int j = 0; j != 8; j++) { |
||||
|
if (string[i] == parentheses[j]) |
||||
|
return 1; |
||||
|
} |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
// найти одну подстроку выделенную латинскими заглавными символами
|
||||
|
Substring FindSubstring(char *inputString, unsigned int length) { |
||||
|
unsigned int begin = 0; |
||||
|
for(int i = 0; i <= length; i++) { |
||||
|
if (isCapital(inputString[i]) && !isCapital(inputString[i + 1])) { |
||||
|
begin = i + 1; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
inputString = GetSubstring(inputString, begin, length); |
||||
|
unsigned int end = 0; |
||||
|
for(int i = 0; i <= length - 1; i++) { |
||||
|
if (!isCapital(inputString[i]) && isCapital(inputString[i + 1])) { |
||||
|
end = i + 1; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
Substring result = { GetSubstring(inputString, 0, end), begin, begin + end, end }; |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
// найти все подстроки в строке, выделенные латинскими заглавными символами
|
||||
|
SubstringCollection FindAllSubstrings(char *inputString, unsigned int length) { |
||||
|
SubstringCollection collection; |
||||
|
collection.Collection = malloc(sizeof(Substring) * 1); |
||||
|
collection.Count = 0; |
||||
|
do { |
||||
|
Substring foundSubstring = FindSubstring(inputString, length); |
||||
|
if (foundSubstring.Length == 0) { |
||||
|
break; |
||||
|
} |
||||
|
else { |
||||
|
collection.Collection = realloc(collection.Collection, sizeof(Substring) * (collection.Count + 1)); |
||||
|
collection.Collection[collection.Count] = foundSubstring; |
||||
|
inputString = GetSubstring(inputString, foundSubstring.End, length); |
||||
|
length = length - foundSubstring.End; |
||||
|
collection.Count++; |
||||
|
} |
||||
|
} while (1); |
||||
|
return collection; |
||||
|
} |
||||
|
|
||||
|
// простой нормальный человеческий метод для чтения из консоли,
|
||||
|
// чтобы не связываться с этим отвратительно мерзким scanf работающим через ...
|
||||
|
char* ReadLine(unsigned int bufferSize) { |
||||
|
char* buffer = calloc(bufferSize, sizeof(char)); |
||||
|
char symbol; |
||||
|
unsigned int counter = 0; |
||||
|
do { |
||||
|
symbol = getchar(); |
||||
|
if (symbol == '\n' || counter >= bufferSize) { |
||||
|
break; |
||||
|
} else { |
||||
|
buffer[counter] = symbol; |
||||
|
counter++; |
||||
|
} |
||||
|
} while (1); |
||||
|
return buffer; |
||||
|
} |
||||
|
|
||||
|
int main() |
||||
|
{ |
||||
|
do { |
||||
|
unsigned inputLength = 4096; |
||||
|
char *inputLine; |
||||
|
SubstringCollection collection; |
||||
|
|
||||
|
printf("\nEnter line:\n"); |
||||
|
inputLine = calloc(inputLength, sizeof(char)); |
||||
|
inputLine = ReadLine(inputLength); |
||||
|
if (inputLine[0] == '\0') |
||||
|
break; |
||||
|
|
||||
|
// ТЕСТОВАЯ СТРОКА: BEGIN usual text END BEGIN text with parentheses{ END BEGIN textwith russian at the endрусский текстEND
|
||||
|
collection = FindAllSubstrings(inputLine, inputLength); |
||||
|
|
||||
|
// создаем список для того, чтобы отметить элементы, которые мы будем удалять
|
||||
|
_Bool *RemoveItemList = calloc(collection.Count, sizeof(_Bool)); |
||||
|
for (int i = 0; i != collection.Count; i++) { |
||||
|
if (CheckForParentheses(collection.Collection[i].String, collection.Collection[i].Length) == 1) |
||||
|
RemoveItemList[i] = 1; |
||||
|
} |
||||
|
// теперь после того, как мы определили подстроки, в которых есть скобки, мы удаляем их
|
||||
|
for (int i = collection.Count; i != 0; i--) { |
||||
|
if (RemoveItemList[i] == 1) |
||||
|
collection = RemoveFromCollection(collection, i); |
||||
|
} |
||||
|
// теперь пробегаемся по остаткам коллекции и удаляем элементы, у которых на конце есть русские символы, если они есть еще где-то, то они не удалятся
|
||||
|
for (int i = 0; i != collection.Count; i++) { |
||||
|
collection.Collection[i] = RemoveRussianSymbolsAtTheEnd(collection.Collection[i].String, collection.Collection[i].Length); |
||||
|
} |
||||
|
// выводим этот хлам
|
||||
|
for (int i = 0; i != collection.Count; i++) { |
||||
|
printf("%d). \"%s\"\n", i+1, collection.Collection[i].String); |
||||
|
} |
||||
|
} while (1); |
||||
|
return 0; |
||||
|
} |
Binary file not shown.
Loading…
Reference in new issue