Продублировать рядом слова, в которых все символы различны - 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
(строка, которую необходимо скопировать).
Список действий, выполняемых в функции:
- Определение длины строки
s
с помощью функцииstrlen
. - Перебор символов строки
s
. - Проверка каждого символа на условие: является ли он разделителем (пробел или знак препинания).
- Если текущий символ является разделителем, то следующий символ не является таковым и процесс повторяется.
- Если текущий символ не является разделителем, то следующий символ также не является разделителем.
- Если текущий символ не является разделителем и предыдущий символ является разделителем, то текущий символ дублируется.
- Если текущий символ является последним символом в строке и предыдущий символ является разделителем, то в конец строки добавляется пробел.
- Если текущий символ является последним символом в строке и предыдущий символ не является разделителем, то процесс повторяется с шага 5.
- Если текущий символ является последним символом в строке и предыдущий символ является разделителем, то процесс повторяется с шага 7.
- Возврат дублированной строки.
В функции
main
создается тестовая строкаLISP, PASCAL, APL, ADA, COBOL, FORTH. (PERL) PHP
, которая выводится на экран. Затем вызывается функцияstr_wdup
с аргументамиsizeof(s)/sizeof(s[0])-1
(размер буфера, исключая нулевой символ) иs
(тестовая строка). Функцияstr_wdup
возвращает дублированную строку, которая выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д