Продублировать рядом слова, в которых все символы различны - C (СИ)

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

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

Со строками вообще проблемы. Помогите написать такую программу. Вводится строка символов. Слово - это любая последовательность символов, ограниченная с двух сторон разделитетями или разделителем и концом (началом) строки. Разделители: пробел, точка, запятая, апостроф, точка с запятой, восклицательный знак, кавычка. Продублировать рядом слова, в которых все символы различны. Результат вывести на экран.

Решение задачи: «Продублировать рядом слова, в которых все символы различны»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #define is_delim(c)  (isspace((c)) || ispunct((c)))
  5.  
  6. char* str_wdup(size_t bufsize, char* s){
  7.     size_t n, k, l;
  8.     char* p, *i, *q, *t = s;
  9.  
  10.     n = strlen(s);
  11.     while(*s){
  12.         while(is_delim(*s))
  13.             ++s;
  14.  
  15.         p = s;
  16.         while(*p && !is_delim(*p))
  17.             ++p;
  18.  
  19.         if(p != s){
  20.             k = 1;
  21.             for(i = s; (i != p) && k; ++i){
  22.                 for(q = i + 1; q != p; ++q){
  23.                     if(*q == *i){
  24.                         k = 0;
  25.                         break;
  26.                     }
  27.                 }
  28.             }
  29.             if(k){
  30.                 l = (size_t)(p - s) + 1;
  31.                 if((n + l) >= bufsize)
  32.                     break;
  33.                 memmove(p + l, p, (n - (size_t)(p - t)) * sizeof(char));
  34.                 *p++ = ' ';
  35.                 memcpy(p, s, (l - 1) * sizeof(char));
  36.                 p += l;
  37.                 n += l;
  38.             }
  39.         }
  40.         s = p;
  41.     }
  42.     return t;
  43. }
  44.  
  45. int main(void){
  46.     char s[256] = "LISP, PASCAL, APL, ADA, COBOL, FORTH. (PERL) PHP";
  47.     puts(s);
  48.     str_wdup(sizeof(s)/sizeof(s[0])-1, s);
  49.     puts(s);
  50.     return 0;
  51. }

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

В этом коде на языке C представлена функция str_wdup, которая принимает входные параметры: bufsize (размер буфера) и s (строка, которую необходимо скопировать). Список действий, выполняемых в функции:

  1. Определение длины строки s с помощью функции strlen.
  2. Перебор символов строки s.
  3. Проверка каждого символа на условие: является ли он разделителем (пробел или знак препинания).
  4. Если текущий символ является разделителем, то следующий символ не является таковым и процесс повторяется.
  5. Если текущий символ не является разделителем, то следующий символ также не является разделителем.
  6. Если текущий символ не является разделителем и предыдущий символ является разделителем, то текущий символ дублируется.
  7. Если текущий символ является последним символом в строке и предыдущий символ является разделителем, то в конец строки добавляется пробел.
  8. Если текущий символ является последним символом в строке и предыдущий символ не является разделителем, то процесс повторяется с шага 5.
  9. Если текущий символ является последним символом в строке и предыдущий символ является разделителем, то процесс повторяется с шага 7.
  10. Возврат дублированной строки. В функции main создается тестовая строка LISP, PASCAL, APL, ADA, COBOL, FORTH. (PERL) PHP, которая выводится на экран. Затем вызывается функция str_wdup с аргументами sizeof(s)/sizeof(s[0])-1 (размер буфера, исключая нулевой символ) и s (тестовая строка). Функция str_wdup возвращает дублированную строку, которая выводится на экран.

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


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

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

10   голосов , оценка 3.9 из 5

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

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

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