Сформировать новую строку поместив в нее слова исходной строки заключенные в круглые скобки - C (СИ)
Формулировка задачи:
Вводится строка,нужно сформировать новую строку поместив в нее слова исходной строки заключенные в круглые скобки. Строка представлена СПИСКОМ!!!
Решение задачи: «Сформировать новую строку поместив в нее слова исходной строки заключенные в круглые скобки»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
char *getStr()
{
char buf[21];
int n, len = 0, curLen;
char *ptr = (char *)malloc(1);
*ptr = '\0';
do
{
n = scanf("%20[^\n]", buf, 21);
if(n < 0)
{
free(ptr);
ptr = NULL;
continue;
}
if(n > 0)
{
curLen = strlen(buf);
len += curLen;
ptr = (char *)realloc(ptr, len + 1);
strcat(ptr, buf);
}
else
scanf("%*c", 0);
}
while(n > 0);
return ptr;
}
int skipSpace(char *s, int i)
{
while ((s[i] == ' ') || (s[i] == '\t') || (s[i] == '('))
{
i++;
}
return i;
}
char *copyWord(char *from, char *to, int i)
{
int k, t=0, b=0;
*to = NULL;
while ((from[i] != ')') && (from[i] != '\0'))
{
k=i;
while ((from[i] != ' ') && (from[i] != '\t') && (from[i] != ')'))
{
t++;
i++;
}
i = k;
to = (char *) realloc (to, (b+t+2));
t=b;
while ((from[i] != ' ') && (from[i] != '\t') && (from[i] != '\0') && (from[i] != ')') )
{
to[t] = from [i];
t++;
i++;
}
to[t] = ' ';
b = t+1;
t = 0;
i = skipSpace(from, i);
}
to[b]='\0';
return to;
}
char *reorg(char *s)
{
int i, l, t;
char *p = (char *)malloc(strlen(s));
char *tmp = (char *)malloc(strlen(s));
*tmp = NULL;
*p = NULL;
for (i=0; s[i] != '\0'; i++)
{
if (s[i] == '(')
{
i++;
i= skipSpace (s, i);
tmp = copyWord (s, tmp, i);
strcat (p, tmp);
}
}
free(tmp);
return p;
}
int main()
{
char *s = NULL, *p = NULL;
while (s = getStr())
{
printf("Source string: '%s' \n", s);
p = reorg(s);
printf("Result string: '%s' \n", p);
free(s);
free(p);
}
printf("The End");
return 0;
}
Объяснение кода листинга программы
- В функции
getStr()используетсяscanf()для чтения ввода пользователя иrealloc()для динамического выделения памяти под строку. - Функция
skipSpace()используется для пропуска пробелов, табов и скобок при чтении ввода. - Функция
copyWord()отвечает за копирование слова из исходной строки в новую строку, помещая его в круглые скобки. - Функция
reorg()используется для переорганизации исходной строки, заключая слова в круглые скобки. - В основной функции
main()используется циклwhile, чтобы продолжать считывать строки от пользователя до тех пор, пока они не введут пустую строку. - Каждая введенная строка передается в функцию
reorg(), которая возвращает новую строку с словами, заключенными в круглые скобки. - Новая строка затем выводится на экран, а старая строка освобождается с помощью
free(). - После вывода всех строк, программа заканчивается и возвращает 0.