/*
Napisać własne wersje następujących funkcji bibliotecznych. 
unsigned strlen(const char *str); - zwraca długość napisu
char *strcpy(char *dst,const char *src); - kopiuje z src do dst, zwraca dst
char *strdup(const char *src); - zwraca dynamiczną kopie src
int strcmp(const char *A,const char *B); - zwr<0 => A<B, zwr>0 => A>B, 0 => A=B
char *strchr(char *str,char ch); - znajduje ch w str zwraca wskaźnik lub null
char *strstr(char *str,const char *sub); - znajduje sub w str zwraca wskaźnik lub null

















*/
#include <iostream>

unsigned strlen(const char *str)
  {
   const char *p=str;
   while(*p) ++p;
   return p-str;
  }

char *strcpy(char *dst,const char *src)
  {
   for(char *p=dst;*src;*(p++)=*(src++)) {}
   return dst;
  }

char *strdup(const char *src)
  {
   unsigned len=strlen(src)+1;
   char *dst=new char[len];
   memcpy(dst,src,len);
   return dst;
  }

int strcmp(const char *A,const char *B)
  {
   while(true)
     {
      char a=*(A++);
      int c=a-*(B++);
      if(c) return c;
      if(!a) return 0;
     }
  }

char *strchr(char *str,char ch)
  {
   while(*str)
     {
      if(ch==*str) return str;
      ++str;
     }
   return 0;
  }

char *strstr(char *str,const char *sub)
  {
   for(const char *p=sub,*k=sub+strlen(sub);*str;++str)
     {
      if(*str==*p)
        {
         if(++p==k) return str+(sub-k)+1;
        }
      else
        {
         if(p>sub)
           {
            str+=(sub-p);
            p=sub;
           }
        }
     }
   return 0;
  }

int main()
  {
   return 0;
  }

