include stdio include string include malloc int getStr char функция вв

  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
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int getStr(char**);//функция ввода строк
int Amount(char* s);//функция считающая количество единиц в первом числе
char* reorg(char *, int q, int* m);//функция ввода строк
char *skipSpaces(char *); //пропуск пробелов
int check(char* s);//проверка строки
char* copyNumber(char** res, char* s, int q, int* m); //ôóíêöèÿ, ïåðåâîðà÷èâàþùàÿ è çàïèñûâàþùàÿ ÷èñëî
//основная функция программы
int main()
{
char* s = NULL; //строка источник
char* p = NULL; //строка приёмник
int flag;
int amount;
int m;
//пока не ввели конец файла работает цикл
while (1)
{
puts("Enter string to make new or CTRL+Z to exit");
flag = getStr(&s); //flag - код ошибки
if (flag == -1) //если он равен -1 - то ввели конец файла
return 0;
if (flag == -2) //если равен -2 - нехватка памяти
{
puts("Memory is out");
return 0;
}
amount = Amount(s);
printf("Source amount: %d\n", amount);
printf("Source string: %s\n", s);//выводим то, что ввели
if (!check(s))
{
puts("Incorrect string. String could contain inly digits.");
free(s);
}
else
{
p = reorg(s, amount, m);//получаем неовую строку
if (p)
printf("Result string: \"%s\"\n", p);//выводим новую строку
else
puts("Result string is empty");
free(s);//очищаем память
free(p);//очищаем память
}
}
puts("That's all. Bye!");
return 0;
}
//пропуск пробелов
char* skipSpaces(char* s)
{
int k = strspn(s, " \t");
return s + k;
}
//проверка, что строка состоит из двотчных чисел
int check(char* s)
{
int k = strspn(s, "01 \t"); //подсчитали сколько символов в ходит в перечисленные
char c = *(s + k); //получили символ после них, если это нуль-байт, то строка ок, иначе - нет
return c == '\0';
}
int getStr(char** s) //получаем строку из входного потока
{
char buf[21];//считываем из входного потока строку с помощью этого буфера, кусками по 20 символов
int n;//сюда будет записываться результат scanf
int len = 0;//сюда длина результирующей строки
*s = (char *)malloc(1);//указатель на результирующую сткроу
**s = '\0';//ноль байт, пока строка имеет только конец строки
do {
n = scanf("%20[^\n]", buf); //считываем буфер
if (n < 0)
{ //если ввели конец файла (ctrl+Z), то будет -1
free(*s); //очищаем память, возвращаем пустой указатель
return -1;
}
if (n > 0) { //если буфер не пустой
len += strlen(buf); //увеличиваем результирующую длину
*s = (char *)realloc(*s, len + 1); //добавляем память
if (*s) //если память выделилась
strcat(*s, buf); //копируем строку из буфера в конец нашей строки
else
{ //если память не выделилась
free(*s); //очищаем память
return -2;
}
}
else
scanf("%*c"); //если перенос строки, то очищаем входной поток
} while (n > 0); //пока во входном потоке есть хоть один символ
return 0;
}
//îïðåäåëåíèå äëèíû ïåðâîãî ñëîâà
//ôóíêöèÿ ïðåîáðàçîâàíèÿ ñòðîêè
char* reorg(char* s, int q, int* m){
char* p; //óêàçàòåëü íà êîíåö ðåçóëüòàòà
char* res;//ðåçóëüòàò
if (*s == 0)
return NULL; //åñëè ñòðîêà ïóñòàÿ, òî âîçâðàùàåì ïóñòîé óêàçàòåëü
p = (char *)calloc(strlen(s) + 1, sizeof(char)); // Âûäåëÿåì ïàìÿòü ïîä ðåçóëüòèðóþùóþ ñòðîêó
res = p;
while (*(s = skipSpaces(s)))
{
s = copyNumber(&p, s, q, &m);
if (p != res) {
if (m==1)
*p++ = ' '; //åñëè ÷èñëî íå ïåðâîå - äîïèøåì ïðáåë-ðàçäåëèòåëü
}//s = copyNumber(&p, s, q, &m);
printf("Source amount: %d\n", m);
}
return (char *)realloc(res, p - res + 1); //âåðíóëè ñòðîêó res, íî ñ îòðóáëåííûìè ëèøíèìè ñèìâîëàìè
}
int Amount(char* s){
int count = 0;
while (*s=='0' || *s==' ')
++s;
while (*s != '\0' && *s != '\t' && *s != ' ')
{
if (*s == '1')
++count;
++s;
}
return count;
}
char* copyNumber(char** res, char* s, int q, int* m){
char* next;
int count = 0, i = 0, t;
*m = 0;
while (*s == '0' || *s == ' ')
++s;
while (*s != '\0' && *s != '\t' && *s != ' ') {
if (*s == '1')
++i;
++s;
++count;
}
next = s;
t = count;
if (i == q){
*m = 1;
while (t){
--s;
--t;
}
while (count){
**res = *s;
++*res;
++s;
--count;
}
}
return next;
}