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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define is_delim(c)  (isspace((c)) || ispunct((c)))
 
char* str_wdup(size_t bufsize, char* s){
    size_t n, k, l;
    char* p, *i, *q, *t = s;
 
    n = strlen(s);
    while(*s){
        while(is_delim(*s))
            ++s;
 
        p = s;
        while(*p && !is_delim(*p))
            ++p;
 
        if(p != s){
            k = 1;
            for(i = s; (i != p) && k; ++i){
                for(q = i + 1; q != p; ++q){
                    if(*q == *i){
                        k = 0;
                        break;
                    }
                }
            }
            if(k){
                l = (size_t)(p - s) + 1;
                if((n + l) >= bufsize)
                    break;
                memmove(p + l, p, (n - (size_t)(p - t)) * sizeof(char));
                *p++ = ' ';
                memcpy(p, s, (l - 1) * sizeof(char));
                p += l;
                n += l;
            }
        }
        s = p;
    }
    return t;
}
 
int main(void){
    char s[256] = "LISP, PASCAL, APL, ADA, COBOL, FORTH. (PERL) PHP";
    puts(s);
    str_wdup(sizeof(s)/sizeof(s[0])-1, s);
    puts(s);
    return 0;
}

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

В этом коде на языке 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
Похожие ответы