Продублировать рядом слова, в которых все символы различны - 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
возвращает дублированную строку, которая выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д