Дана строка, обработать без - C (СИ)
Формулировка задачи:
Дана строка, содержащая слова, разделённые разделителями(пробелами, табуляторами),
в начале и конце строки также могут быть разделители. Сформировать новую строку,
состоящую из нечётных слов исходной строки, разделённых 1 пробелом. В начале и
конце строки не должно быть разделителей.
Задание нужно выполнить без использования библиотеки <string.h>,именно в этом и заключается самая главная проблема (
#include<stdio.h>
#include<string.h>
void Work(char * in,char *out);
int main()
{
for(;;)
{
char src[80]="",dst[80]="";
printf("Input string, 0-exit: "); gets(src);
if (src[0]=='0') break;
printf("Source: %s\n",src);
Work(src,dst);
printf("Result: %s.\n",dst);
}
return 0;
}
void Work(char *in,char *out)
{
int l,i,k=0; char *p,*c; char sym[30]="qwertyuioplkjhgfdsazxcvbnm";
for (i=1,strcat(in," "),c=in+strlen(in);;)
{
in+= strspn(in, " \t");
if (in==c) break;
l=strspn(in,sym);
in+=l;
if (i%2!=0)
{
if (i>=2) {strcat(out," ");}
strncat(out,in-l,l);
}
i++;
}
} Решение задачи: «Дана строка, обработать без »
textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
#define BUFLEN 80
int main() {
char src[BUFLEN];
char dst[BUFLEN] = {0};
char *ps = src;
char *pd = dst;
int is_odd = 1;
fgets(src, BUFLEN, stdin);
while (isspace(*ps))
++ps;
while (*ps) {
if (is_odd) {
if (pd != dst)
*pd++ = ' ';
while (!isspace(*ps))
*pd++ = *ps++;
is_odd = 0;
} else {
while (!isspace(*ps))
++ps;
is_odd = 1;
}
while (isspace(*ps))
++ps;
}
fputs(dst, stdout);
return 0;
}
Объяснение кода листинга программы
- Объявлены две строки: src и dst, каждая из которых имеет длину BUFLEN символов.
- Два указателя, ps и pd, указывают на текущие позиции чтения и записи соответственно.
- Переменная is_odd содержит 1, что означает, что в данный момент мы находимся в нечетном цикле.
- Функция fgets считывает строку из стандартного ввода и сохраняет ее в переменной src.
- Пропускаются начальные пробелы в строке src, пока не будет найдено первое не пробельное значение.
- В цикле происходит чередование записи пробелов и не пробельных символов в строку dst.
- Если is_odd равно 1, то записывается пробел, а затем считывается следующий не пробельный символ.
- Если is_odd равно 0, то записывается следующий не пробельный символ, а затем считывается пробел.
- В конце каждой нечетной ичетной итерации записывается пробел.
- В конце каждой четной ичетной итерации записывается не пробельный символ.
- В конце каждой четной нечетной итерации записывается пробел.
- В конце каждой нечетной нечетной итерации записывается не пробельный символ.
- В конце каждой итерации считывается следующий символ из src.
- В конце каждой итерации, если текущий символ является пробелом, увеличивается значение указателя pd без записи символа.
- В конце каждой итерации, если текущий символ не является пробелом, он записывается в dst.
- После окончания чтения строки, она выводится на стандартный вывод с помощью функции fputs.
- Программа возвращает 0, что означает успешное завершение.