-
Notifications
You must be signed in to change notification settings - Fork 33
Expand file tree
/
Copy pathchar_changer.cpp
More file actions
71 lines (57 loc) · 2.82 KB
/
char_changer.cpp
File metadata and controls
71 lines (57 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <cctype>
#include <cstddef>
// Есть ощущение, что это можно решить как-то более лаконично и просто
/**
* @brief Получить длину последовательности из одинаковых знаков.
* @param array указатель на элемент массива, с которого начнется проверка.
* @return Длина последовательности.
* @note Все символы будут сравниваться с первым из переданного массива.
*/
size_t GetIdenticalCharSequenceLen(char *array) {
size_t sequenceLen = 0;
if (array[0] == '\0') return 0;
while (array[0] == array[sequenceLen]) ++sequenceLen;
return sequenceLen;
}
/**
* @brief Сконвертировать одинаковые символы.
* @param array указатель на начало обрабатываемого массива.
* @param convertedSymIdx ссылка на индекс последнего сконвертированного символа.
* @param currentSymIdx ссылка на индекс текущего обрабатываемого символа.
* @param swapChar символ, на который будет произведена замена array[convertedSymIdx].
* @return none
*/
void ConvertIdenticalCharacters(char array[], size_t& convertedSymIdx, size_t& currentSymIdx, char swapChar) {
size_t sequenceLen = GetIdenticalCharSequenceLen(&array[currentSymIdx]);
array[convertedSymIdx++] = swapChar;
if (sequenceLen == 1) {
currentSymIdx += sequenceLen;
return;
}
array[convertedSymIdx++] = sequenceLen >= 10 ? '0' : sequenceLen + '0';
currentSymIdx += sequenceLen;
}
size_t CharChanger(char array[], size_t size, char delimiter = ' ') {
size_t convertedSymbolIdx = 0, currentSymbolIdx = 0;
while(currentSymbolIdx < size && convertedSymbolIdx < size) {
if (array[currentSymbolIdx] == '\0') {
break;
}
if (isspace(array[currentSymbolIdx])) {
currentSymbolIdx += GetIdenticalCharSequenceLen(&array[currentSymbolIdx]);
array[convertedSymbolIdx++] = delimiter;
continue;
}
if (isalnum(array[currentSymbolIdx])) {
if (isdigit(array[currentSymbolIdx])) {
ConvertIdenticalCharacters(array, convertedSymbolIdx, currentSymbolIdx, '*');
continue;
}
ConvertIdenticalCharacters(array, convertedSymbolIdx, currentSymbolIdx, toupper(array[currentSymbolIdx]));
continue;
}
ConvertIdenticalCharacters(array, convertedSymbolIdx, currentSymbolIdx, '_');
}
array[convertedSymbolIdx] = '\0';
return convertedSymbolIdx;
}