Напечатать все слова, которые встречаются в последовательности по одному разу - C (СИ)
Формулировка задачи:
Сам попробовал написать код,но везде одни ошибки.
Можете выручить ?
Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 прописных латинских букв; между соседними словами - запятая, за последним словом - точка. Напечатать все слова, которые встречаются в последовательности по одному разу.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void * a,const void *b)
{
return srtcmp(*(char **)b,*(char **)a);
}
typedef char string_t[300];
#define GET_srting(s) (scanf("%250")[^\n]%"c",((s))==1)
#define MAX_Words[30]
#define DELIM ",\t\n"
int main (void){
string_t str;
while ((printf("String")) && GET_srting(str)){
char * words[MAX_WORDS],*p=strchr(str,'.');
int cout=0;
if(p)
*p='\0';
for (p=strtok(str,DELIM); p&& cout <MAX_WORDS;p=strtok(NULL,DELIM)) words[cout++]=p;
qsort(words,cout,sizeof(char*),cmp);
while (cout)
printf("%s\n",words[-count]);
}
return 0;
}Решение задачи: «Напечатать все слова, которые встречаются в последовательности по одному разу»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "every,breath,you,take,every,move,you,make.";
char word[10], *p, *start = s;
int i = 0, j = 0, n = 0;
while(s[i]){
if(s[i] != ',' && s[i] != '.'){
word[j] = s[i];
j++;
}
else{
word[j] = '\0';
j = 0;
while(1){
p = strstr(start, word);
if(p == NULL)break;
n++;
if(n > 1)break;
start = p + strlen(word);
}
if(n <= 1)
printf("%s,", word);
n = 0;
start = s;
}
i++;
}
printf("\b.");
return 0;
}
Объяснение кода листинга программы
В этом коде на языке C:
- Задана строка
s[], которая содержит последовательность слов, разделенных запятыми и точками. - Переменная
word[10]используется для хранения текущего слова, которое встречается в последовательности. - Переменная
pиспользуется как указатель на текущий символ в строкеs[]. - Переменная
startуказывает на начало текущего слова в строкеs[]. - Переменные
iиjиспользуются для индексации символов в строкеs[]. - Переменная
nиспользуется для подсчета количества раз, которое каждое слово встречается в последовательности. - В цикле
whileпроисходит чтение каждого символа в строкеs[]. - Если текущий символ не является запятой или точкой, он добавляется в переменную
word[j]. - Если текущий символ является запятой или точкой, он помещается в начало следующего слова и переменная
nсбрасывается в 0. - В цикле
whileпроисходит поиск всех вхождений текущего слова в оставшуюся часть строкиs[]. - Если текущее слово встречается в последовательности менее двух раз, оно выводится на консоль вместе с запятой.
- После завершения цикла
whileвыводится точка. - Функция
mainвозвращает 0, что означает успешное выполнение программы.