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