Дана строка, обработать без - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дана строка, содержащая слова, разделённые разделителями(пробелами, табуляторами), в начале и конце строки также могут быть разделители. Сформировать новую строку, состоящую из нечётных слов исходной строки, разделённых 1 пробелом. В начале и конце строки не должно быть разделителей. Задание нужно выполнить без использования библиотеки <string.h>,именно в этом и заключается самая главная проблема (
Листинг программы
  1. #include<stdio.h>
  2. #include<string.h>
  3. void Work(char * in,char *out);
  4. int main()
  5. {
  6. for(;;)
  7. {
  8. char src[80]="",dst[80]="";
  9. printf("Input string, 0-exit: "); gets(src);
  10. if (src[0]=='0') break;
  11. printf("Source: %s\n",src);
  12. Work(src,dst);
  13. printf("Result: %s.\n",dst);
  14. }
  15. return 0;
  16. }
  17. void Work(char *in,char *out)
  18. {
  19. int l,i,k=0; char *p,*c; char sym[30]="qwertyuioplkjhgfdsazxcvbnm";
  20. for (i=1,strcat(in," "),c=in+strlen(in);;)
  21. {
  22. in+= strspn(in, " \t");
  23. if (in==c) break;
  24. l=strspn(in,sym);
  25. in+=l;
  26. if (i%2!=0)
  27. {
  28. if (i>=2) {strcat(out," ");}
  29. strncat(out,in-l,l);
  30. }
  31. i++;
  32. }
  33. }

Решение задачи: «Дана строка, обработать без »

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. #define BUFLEN 80
  5.  
  6. int main() {
  7.     char src[BUFLEN];
  8.     char dst[BUFLEN] = {0};
  9.     char *ps = src;
  10.     char *pd = dst;
  11.     int is_odd = 1;
  12.     fgets(src, BUFLEN, stdin);
  13.     while (isspace(*ps))
  14.         ++ps;
  15.     while (*ps) {
  16.         if (is_odd) {
  17.             if (pd != dst)
  18.                 *pd++ = ' ';
  19.             while (!isspace(*ps))
  20.                 *pd++ = *ps++;
  21.             is_odd = 0;
  22.         } else {
  23.             while (!isspace(*ps))
  24.                 ++ps;
  25.             is_odd = 1;
  26.         }
  27.         while (isspace(*ps))
  28.             ++ps;
  29.     }
  30.     fputs(dst, stdout);
  31.     return 0;
  32. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы