
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int my_strncmp(const char* firstS, const char* secondS, int n) {
while (n--) {
if (*firstS != *secondS) return *firstS - *secondS;
if (*firstS == '\0') return 0;
firstS++;
secondS++;
}
return 0;
}
char* my_strcat(char* result, const char* toAdd) {
char* ptr = result;
while (*ptr != '\0') {
ptr++;
}
while (*toAdd != '\0') {
*ptr = *toAdd;
ptr++;
toAdd++;
}
*ptr = '\0';
return result;
}
char* my_strncat(char* result, char* toAdd, int n) {
char* ptr = result;
while (*ptr != '\0') {
ptr++;
}
while (*toAdd != '\0' && n > 0) {
*ptr = *toAdd;
ptr++;
toAdd++;
n--;
}
*ptr = '\0';
return result;
}
// функция проверки разделителем
int is_razdel(char c, char* razdel) {
while (*razdel) {
if (c == *razdel)
return 1;
razdel++;
}
return 0;
}
int main() {
char text[100];
char result[100] = ""; // инициализация массива для результата
char* words[100]; // массив для хранения уникальных слов
int word_count = 0, // счетчик уникальных слов
repeat = 0;
char* word; // указатель на слово
char razdel[] = " ,.!?-\n"; // разделители
printf("input: ");
fgets(text, 100, stdin);
// разбиение текста
char* ptr = text;
while (*ptr != '\0') {
repeat = 0; // Reset repeat flag for each word
// начало слова
while (*ptr != '\0' && is_razdel(*ptr, razdel))
ptr++;
// cохраняем начало слова
word = ptr;
// конец слова
while (*ptr != '\0' && !is_razdel(*ptr, razdel))
ptr++;
// cохраняем конец слова
char* end_word = ptr;
// проверяем, было ли такое слово
// проверяем, было ли такое слово
for (int i = 0; i < word_count; i++) {
if (my_strncmp(words[i], word, end_word - word) == 0 ){
repeat = 1;
break;
}
}
// если не повторялось, то добавляем
if (!repeat) {
my_strncat(result, word, end_word - word);
words[word_count++] = word;
}
// добавляем разделитель
if (*ptr != '\0') {
my_strncat(result, ptr, 1);
// my_strcat(result, " ");
ptr++;
}
}
printf("output: %s\n", result);
}