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 >
Wrap
C/C++ Source or Header
|
1997-03-22
|
3KB
|
129 lines
/*
* Operazioni sulle stringhe
* Premessa: in C le stringhe sono array di char terminati dal carattere
* con codice 0 indicato con '\0'.
*/
#include <stdio.h>
#define MAX 20
#define EOS '\0'
#define true 1
#define false 0
int length(char str[]) /* calcola lunghezza (senza EOS) */
{
int i;
for (i=0;str[i];i++); /* (str[i]!=EOS) abbreviato in str[i] */
return(i);
}
void copy(char s[],char t[]) /* copia s in t */
{
int i;
for (i=0;s[i];i++) t[i]=s[i];
t[i]=EOS; /* "chiudo" la stringa */
}
void concat(char s[],char t[],char r[]) /* concatena s e t in r */
{
int i,j;
for (i=0;s[i];i++) r[i]=s[i];
for (j=0;t[j];j++) r[i+j]=t[j];
r[i+j]=EOS;
}
void reverse(char s[],char t[]) /* rovescia s in t */
{
int i,j;
for (i=0;s[i];i++);
for (j=i;j>0;j--) t[i-j]=s[j-1];
t[i]=EOS;
}
int member(char el, char s[]) /* controlla se el sta in s */
{
int i;
for (i=0;s[i];i++)
if (s[i]==el) return true;
return false;
}
int rmember(char el, char s[], int i) /* versione ricorsiva */
{
if (s[i]==EOS) return false;
else if (s[i]==el) return true;
else return(rmember(el,s,++i)); /* oss: i++ non va bene! */
}
int compare(char s[],char t[]) /* confronta due stringhe */
{
int i;
for (i=0;s[i];i++) if (s[i]!=t[i]) return false;
return(t[i]==EOS);
}
int sub(char s[],char t[]) /* s sottostringa di t */
{
int i,j;
for (i=0;t[i];i++)
{
for (j=0;s[j];j++) if (s[i]!=t[i+j]) break;
if (s[i]==EOS) return true;
}
return false;
}
void answer(int cond) /* stampa messaggi */
{
if (cond) printf("Yes!\n");
else printf("No!\n");
}
void main(void)
{
char r[MAX];
char s[MAX];
char t[MAX];
char c;
int end;
printf("COMMANDS: r str(reverse);c str str'(concat);m c str(member);\n");
printf("s str str'(sub);a str str'(append);q quit\n");
end=0;
while(!end) /* interfaccia utente */
{
while ((c=getchar())<'a' || c>'z'); /* salta '\n' ecc */
switch (c)
{
case 'a': scanf(" %s %s",s,t);
concat(s,t,r);
printf("Concat: %s\n",r);
break; /* break esce da switch, se non si mette
* vengono esaminati i casi seguenti ! */
case 'r': scanf(" %s",s);
reverse(s,t);
printf("Reversed: %s\n",t);
break;
case 'c': scanf(" %s %s",s,t);
answer(compare(s,t));
break;
case 'm': scanf(" %c %s",&c,s);
answer(member(c,s));
break;
case 's': scanf(" %s %s",s,t);
answer(sub(s,t));
break;
case 'q': default: ++end;
/* anche piu' etichette per un solo caso */
}
}
}