Дана строка, обработать без - 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;
}

Объяснение кода листинга программы

  1. Объявлены две строки: src и dst, каждая из которых имеет длину BUFLEN символов.
  2. Два указателя, ps и pd, указывают на текущие позиции чтения и записи соответственно.
  3. Переменная is_odd содержит 1, что означает, что в данный момент мы находимся в нечетном цикле.
  4. Функция fgets считывает строку из стандартного ввода и сохраняет ее в переменной src.
  5. Пропускаются начальные пробелы в строке src, пока не будет найдено первое не пробельное значение.
  6. В цикле происходит чередование записи пробелов и не пробельных символов в строку dst.
  7. Если is_odd равно 1, то записывается пробел, а затем считывается следующий не пробельный символ.
  8. Если is_odd равно 0, то записывается следующий не пробельный символ, а затем считывается пробел.
  9. В конце каждой нечетной ичетной итерации записывается пробел.
  10. В конце каждой четной ичетной итерации записывается не пробельный символ.
  11. В конце каждой четной нечетной итерации записывается пробел.
  12. В конце каждой нечетной нечетной итерации записывается не пробельный символ.
  13. В конце каждой итерации считывается следующий символ из src.
  14. В конце каждой итерации, если текущий символ является пробелом, увеличивается значение указателя pd без записи символа.
  15. В конце каждой итерации, если текущий символ не является пробелом, он записывается в dst.
  16. После окончания чтения строки, она выводится на стандартный вывод с помощью функции fputs.
  17. Программа возвращает 0, что означает успешное завершение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5
Похожие ответы