home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / CataniaB / teach-act / esempi / Stringhe / stringop.c next >
C/C++ Source or Header  |  1997-03-22  |  3KB  |  129 lines

  1. /* 
  2. * Operazioni sulle stringhe   
  3. * Premessa: in C le stringhe sono array di char terminati dal carattere 
  4. * con codice 0 indicato con '\0'. 
  5. */
  6. #include <stdio.h>
  7. #define MAX 20
  8. #define EOS '\0'
  9. #define true 1
  10. #define false 0
  11.  
  12. int length(char str[]) /* calcola lunghezza (senza EOS) */
  13.   {
  14.    int i;
  15.  
  16.    for (i=0;str[i];i++);   /* (str[i]!=EOS) abbreviato in str[i] */ 
  17.    return(i);
  18.   }
  19.  
  20. void copy(char s[],char t[]) /* copia s in t */
  21.   { 
  22.     int i;
  23.     for (i=0;s[i];i++) t[i]=s[i];
  24.     t[i]=EOS;                     /* "chiudo" la stringa */ 
  25.   }
  26.  
  27. void concat(char s[],char t[],char r[]) /* concatena s e t in r */
  28.   {
  29.    int i,j;
  30.  
  31.    for (i=0;s[i];i++) r[i]=s[i]; 
  32.    for (j=0;t[j];j++) r[i+j]=t[j];
  33.    r[i+j]=EOS;  
  34.   }
  35.  
  36. void reverse(char s[],char t[]) /* rovescia s in t */
  37.   {
  38.    int i,j;
  39.  
  40.    for (i=0;s[i];i++); 
  41.    for (j=i;j>0;j--) t[i-j]=s[j-1];
  42.    t[i]=EOS;  
  43.   }
  44.  
  45. int member(char el, char s[]) /* controlla se el sta in s */
  46.    { 
  47.     int i;
  48.  
  49.     for (i=0;s[i];i++)
  50.       if (s[i]==el) return true;
  51.     return false;
  52.   } 
  53.  
  54. int rmember(char el, char s[], int i) /* versione ricorsiva */
  55.   {
  56.     if (s[i]==EOS)     return false;
  57.     else if (s[i]==el) return true;
  58.     else return(rmember(el,s,++i)); /* oss: i++ non va bene! */
  59.   } 
  60.  
  61. int compare(char s[],char t[])     /* confronta due stringhe */
  62.   {
  63.    int i;
  64.    for (i=0;s[i];i++) if (s[i]!=t[i]) return false;
  65.    return(t[i]==EOS);
  66.   }
  67.  
  68.  
  69. int sub(char s[],char t[])    /* s sottostringa di t */
  70.   {
  71.    int i,j;
  72.  
  73.    for (i=0;t[i];i++) 
  74.     { 
  75.       for (j=0;s[j];j++) if (s[i]!=t[i+j]) break;
  76.       if (s[i]==EOS) return true;
  77.     }
  78.    return false;
  79.   }
  80.  
  81. void answer(int cond)    /* stampa messaggi */
  82.  {
  83.    if (cond) printf("Yes!\n");
  84.    else printf("No!\n");
  85.  }
  86.  
  87.  
  88. void main(void)
  89. {
  90.  char r[MAX];
  91.  char s[MAX];
  92.  char t[MAX];
  93.  char c;
  94.  int end;
  95.  
  96.  printf("COMMANDS: r str(reverse);c str str'(concat);m c str(member);\n");
  97.  printf("s str str'(sub);a str str'(append);q quit\n");  
  98.  end=0;
  99.  while(!end)  /* interfaccia utente */
  100.   {
  101.     while ((c=getchar())<'a' || c>'z');  /* salta '\n' ecc */
  102.     switch (c)
  103.      {
  104.       case 'a': scanf(" %s %s",s,t); 
  105.                  concat(s,t,r);
  106.                  printf("Concat: %s\n",r);
  107.                  break;          /* break esce da switch, se non si mette 
  108.                                   * vengono esaminati i casi seguenti ! */
  109.       case 'r': scanf(" %s",s); 
  110.                  reverse(s,t);
  111.                  printf("Reversed: %s\n",t);
  112.                  break;
  113.       case 'c': scanf(" %s %s",s,t); 
  114.                  answer(compare(s,t));
  115.                  break;
  116.       case 'm':  scanf(" %c %s",&c,s); 
  117.                  answer(member(c,s));
  118.                  break;
  119.       case 's': scanf(" %s %s",s,t); 
  120.                  answer(sub(s,t));
  121.                  break;     
  122.       case 'q':  default:  ++end;  
  123.         /* anche piu' etichette per un solo caso */
  124.      } 
  125.   }
  126.  
  127. }
  128.  
  129.