//Программа для подсчета слов.V1.b

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

#define IN 1
#define OUT 0
#define LINE_MAX 4096
int flonw (char s1[],char w[],int *max); //Нахождение длиннейшего слова в строке s1.

int gline (char str[],int lim);			//Ввод строки

void copy (char s1[],char s2[]); 		//Копирование строк

int main(void)
{
	char strin[LINE_MAX],lword[LINE_MAX],out[LINE_MAX];
	int k,nword = 0,len = 0,max = 0;
	do
	{
		if ((k=gline(strin,LINE_MAX)) == -2)
		{printf("ОШИБКА!!!\n");exit(0);}
		nword+=flonw(strin,lword,&len);
		if (len>max){
			max=len;
			copy(lword,out);
		}
		len=0;
	}
	while (k!=-1);
	printf ("\nКонец ввода\nКоличество слов:%d\nСамое длинное слово:%d Символов\n<%s>\n",nword,max,out);
}

int gline (char str[],int lim){				//Ввод строки
	int c,i;
	for (i=0;i<lim && (c=getchar())!=EOF && c!='\n';++i){
		str[i]=c;
	}
	if(i<lim){						//Проверка на переполенеие
		if (c=='\n')
			 str[i]='\0';			//Добавление символа окончания строки
		if (c==EOF){
			str[i]='\0';			//Добавление символа окончания строки
			return -1;				//Код конца ввода
		}
		return i;
	}
	return -2;						//Код переполнения
}

int flonw (char s1[],char w[],int *maxl){ 	//Нахождение длиннейшего слова в строке s1.
	int c,i=0,j=0,n=0,l=0,ind=OUT;
	char t[LINE_MAX];
	do
	{
		c = s1[i++];
		if (c==' ' || c=='\t' || c=='\n' || c== ',' || c=='.' || c=='!' || c=='?' || c==';' || c == '\0'){
			ind=OUT;
			if (l>*maxl){
				*maxl=l;
				t[j]='\0';
				copy(t,w);
			}
			l=0;j=0;
		}
		else if(isdigit(c))
		{
			t[j++]=c;			//Запись слова
			if(ind==OUT){
				ind=IN;
				++n;		//Счетчик кол-ва слов
			}
			++l;			//Счетчик длины слов
		}
	}
	while (c != '\0');
	return n;
}

void copy (char s1[],char s2[]){ 			//Копирование строк
	int i;
	for (i=0;s1[i]!='\0';++i)
		s2[i]=s1[i];
	s2[i]='\0';
}
