
//Autore:3^B - Data ultima modifica 28/2/2026
//Breve descrizione del programma: funzioni sulle stringhe

#include<stdio.h>

/**** X==DA codificare
1) void copia(char s[],char t[]);   // s=t
2) void concatena(char s[], char t[]); // s=s+t
3) int lunghezza(char s[]); // se s=="ciao" ritorna 4
4) void maiuscolo(char s[]); // mette in maiuscolo i caratteri minuscoli
5) void minuscolo(char s[]); // mette in minuscolo i caratteri maiuscoli
6) int confronta(char s[], char t[]); /// ritorna 0 se le due stringe sono uguali,
< 0 se la prima e' minore, > 0 se la prima e' maggiore
7) void squeeze(char s[]);   /// toglie gli spazi da s[],
se s=="ciao a tutti" diventa "ciaoatutti"
X 8) void reverse(char s[]); /// se s=="roma" diventa "amor"
X 9) int numero(char s[]); /// se s == "1234" ritorna 1234
X 10)int enumero(char s[]); /// ritorna vero se s e' un numero


Piu' difficili:
X 11) int doppie(char s[]); // verifica se in s[] ci sono, 2 elle, o 2 t, esempio "pollo" o "atto"
                      // ritona vero o falso
X 12) void PrimaLettera(char s[]); // se s[]="ciao a tutti" --> "Ciao A Tutti";
char ce(str[],t[]);  // verifica se la stringa t[] e' contenuta in str[]
s="albero", t="ero" ritorna 1, t="albe" ritorna 1, t = "b" ritorna 1, t="albo" ritorna 0

DIFFICILE
X 13) void password(char pswd[], int maius, int minus, int cifre, int lung)
Si ritorna una password in pswd della lunghezza lung.
maius,minus,cifre sono 3 booleani (vero o falso) a seconda che la password contenga
o meno maiuscole, minuscole o cifre

Esempio pswd="Mabk9" se maius=1, minus=1, cifre=1, lung=5
pswd="XKBF" se maius=1, minus=0, cifre=0, lung=4

6 marzo 2026:

Altre abbastanza facili:
________________________

A) mettere in una stringa l'alfabeto minuscolo
B) int vocali(char s[]): ritorna il numero di vocali (minuscole) in una stringa 
C) int consonanti(char s[]): ritorna il numero di consonanti (minuscole) in una stringa
D) void ebraico(char s[]): toglie le vocali (minuscole) da s[] 
E) void anagramma(char s[]): ritorna un anagramma di s[] 
F) void binario(char s[], int nbit): ritorna una stringa lunga nbit in binario


******/

#define MAX 256  // max lunghezza stringhe=255 Caratteri


void scrivi(char s[]) {   /// visualizza una stringa, come puts()
	int i;
	for (i = 0;  s[i] != '\0'; i++)
		putchar(s[i]);
}



void copia(char s[], char t[]) { // come strcpy()
	int i = 0;
	while ((s[i] = t[i])) i++;   /// copia t[i] in s[i] e poi s[i] diventa valore booleano, se '\0' == 0 e' falso
}

void concatena(char s[], char t[]) { /// come strcat()
	int i = 0, j = 0;
	while (s[i]) i++;   /// si ferma quando s[i] == '\0'
	while (t[j]) s[i++] = t[j++]; /// copia t in s, partendo dalla fine di s (la posizione del '\0' di s)
	s[i] = '\0'; /// chiudo la stringa s
}

int lunghezza(char s[])  /// ritorna la lunghezza di una stringa come strlen()
{
	int i;
	for(i=0; s[i]; i++)   /// s[i] diventa false, quando i indica la posizione del '\0'
		;
	return i;
}

int ce(char s[], char t[]){ /// verifica se la t[] e' contenuta nella s[] come strstr()
    int i, j = 0, cont = 0;

    for(i = 0; s[i]!='\0' && t[j] !='\0'; i++){ // ottimizzabile, posso togliere != '\0
            if(s[i] == t[j])
                cont++,j++;
            else
                j = 0,cont=0;
    }

    return cont == lunghezza(t);  /// ritorna vero se sono uguali


}

int confronta(char s[], char t[])   /// ritorna 0 se le due stringe sono uguali, < 0 se la prima e' minore, > 0 se la prima e' maggiore
// come strcmp()
{
    int i=0;
    for(i=0; s[i] != '\0' && t[i] != '\0'; i++)
    {
        if(s[i] > t[i])
            return 1;
        else if(s[i] < t[i])
            return -1;
    }
    return 0;
}

int confronta2(char s[], char t[])   /// ritorna 0 se le due stringe sono uguali, < 0 se la prima e' minore, > 0 se la prima e' maggiore
// come strcmp()
{
    int i=0;
    for(i=0; s[i] != '\0' && t[i] != '\0' && s[i]==t[i]; i++)
    		;
	return s[i] - t[i];
}

int vocali(char s[])
{  // ritorna il numero di vocali in s[]
    int i;
    int conta_voc=0;
    for(i=0; s[i] !='\0'; i++)
        if(s[i]=='a' || s[i]=='e' || s[i]=='i' || s[i]=='o'|| s[i]=='u')
            conta_voc=conta_voc+1;
    return conta_voc;
}

void squeeze(char s[]) // toglie gli spazi dalla stringa s
{
    int i;
    int j=0;  // indice in cui copio
    for(i=0; s[i]!='\0'; i++)
        if(s[i]!=' ')
        {
            s[j]=s[i];
            j++;
        }
    s[j]='\0'; // chiudo la stringa
}



int   main() {
	char s1[MAX], s2[MAX], s3[MAX];
	printf("Str1 che contiene->");
	gets(s1);
	printf("Str2 contenuta ->");
	gets(s2);
	printf("[%s] contenuta in [%s] == %d\n",s1,s2,ce(s1,s2));
	printf("[%s] confrontata con [%s] == %d\n",s1,s2,confronta2(s1,s2));
	copia(s3, s1);   /// in s3 c'e' una copia di s1
	printf("copia() di Str1 in s3=%s\n", s3);
	concatena(s3,s2); /// s3=s3+s2
	printf("concatena(s3,s2) =%s\n", s3);
	printf("Vocali in %s = %d\n",s3,vocali(s3));
	squeeze(s3);
	printf("Squeeze di s3=%s\n",s3);
	return 0;
}
