-
Notifications
You must be signed in to change notification settings - Fork 33
Expand file tree
/
Copy pathchar_changer.cpp
More file actions
72 lines (61 loc) · 2.42 KB
/
char_changer.cpp
File metadata and controls
72 lines (61 loc) · 2.42 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
72
#include <cstddef>
#include <stdexcept>
#include <cctype>
size_t CharChanger(char array[], size_t size, char delimiter = ' ') {
if (size == 0) return 0;
size_t pos_read = 0; // позиция чтения
size_t pos_write = 0; // позиция записи
while (array[pos_read] != '\0') { // проверка на последний символ
char current_char = array[pos_read]; // изменяемый символ
size_t count = 1;
while (pos_read + count < size && array[pos_read + count] == current_char) { // подсчет повторающихся символов
++count;
}
if (isdigit(current_char)) {// проверка на цифры
current_char = '*';
}
else if (islower(current_char)) { // проверка на строчные буквы
current_char = toupper(current_char);
}
else if (!isupper(current_char) && current_char != ' ') { //остальные символы, кроме пробелов и прописных букв
current_char = '_';
}
if (current_char == ' ') { // оработка пробелов
current_char = delimiter;
if (pos_write < size) {
array[pos_write] = current_char;
++pos_write;
}
}
else { // обработка остальных символов
if (pos_write < size) { //записываем символ
array[pos_write] = current_char;
++pos_write;
}
if ( count > 1) { ///обрабатываем повторения
if (count >= 10) {
if (pos_write < size) {
array[pos_write] = '0';
++pos_write;
}
}
else {
if (pos_write < size) {
array[pos_write] = '0' + count;
++pos_write;
}
}
}
}
pos_read += count;
}
// Добавляем завершающий нуль-символ
if (pos_write < size) {
array[pos_write] = '\0';
}
else if (size > 0) {
array[size - 1] = '\0';
pos_write = size - 1;
}
return pos_write;
}