/* Сформировать новую строку, в которой удалить из каждого слова */
/* исходной строки символы, встречающиеся 1-раз. */
/* lamed, rfpro, 2010 */
/* очередная буква слова повторяется, если она встречается среди */
/* записанных или среди оставшихся */
#include <stdio.h>
int iswhite(int c);
// является ли символ пробельным
int found(const char c, const char t[], const int first, const int last);
// найдена ли буква в подмассиве символов
void create(char s[], const char t[]);
int main(void)
{
enum {SIZE=1000};
char s[SIZE];
char t[SIZE];
gets(t);
create(s,t);
puts(s);
system("pause");
return 0;
}
int iswhite(const int c)
{
return (c==' '||c=='\t');
}
void create(char s[], const char t[])
{
int i, j, k;
int c;
int inword;
int firstr, lastr; // первая и последняя буквы прочитанного слова
int firstw, lastw; // первая и последняя буквы записанного слова
int written=0;
i=0;
while (iswhite(c=t[i])) // пропускаем левые пробелы
i++;
if (t[i]=='\0')
{
s[i]='\0';
return;
}
inword=1;
j=0;
while ((c=t[i])!='\0')
{
if (!iswhite(c))
{
firstr=i;
while ((c=t[i])!='\0' && !iswhite(c))
i++;
lastr = i-1;
for (k=firstr; k<=lastr; k++)
{
if (found(t[k], t, k+1, lastr) ||
(written==1) && found(t[k], s, firstw, lastw))
{
if (written==0) // буква уже записана
{
firstw=j; // позиция первой записанной буквы
written=1;
}
lastw=j; // позиция последней записанной буквы
s[j++]=t[k];
}
}
if (written==1)
{
s[j++]='_'; // если слово записано, тогда пробел
written=0;
}
}
else
while ((c=t[i])!='\0' && iswhite(c)) // пропуск пробелов
i++;
}
if (s[j-1]=='_')
j--;
s[j]='\0';
}
int found(const char c, const char t[], const int first, const int last)
{
int i;
for (i=first; i<=last; i++)
if (c==t[i])
return 1;
return 0;
}
Границы ключ переломлен пополам /* Гражданская оборона */
еелле_попо_ааа_ооо
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.