Funzione di confronto array char

Ciao a tutti, mi sto dilettando con le funzioni e a confrontare gli array char.
Ho fatto queta funzione:

boolean Confronta(const char*a,const char*b,byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)
	boolean stato;
Serial.println(a);
Serial.println(b);
	for (byte i=0;i<k+1;i++){
		 if (a[i]!=b[i]){stato=false;break;}  //se trova un char diverso, blocca la ricerca e restituisci falso
	                        }
Serial.println(stato);
	if(stato){return 1;}
	else{return 0;}
	
}

Mi restituisce sempre falso anche quando i due array sono uguali:cosa sbaglio???
Grazie

"i<k+1"

perchè vai oltre di 1 byte se ne devi confrontare 10 l'undicesimo a che serve?

Serial.println(stato);
	if(stato){return 1;}
	else{return 0;}

semplicemente fai

return stato;

e all'inizio della funzione

boolean stato=true;

perchè quando la inizializzi la variabile è uguale a zero(quindi falso) e nella funzione nulla la porta a 1 (cioè vero)

manolomao:
Ciao a tutti, mi sto dilettando con le funzioni e a confrontare gli array char.
Ho fatto queta funzione:

boolean Confronta(const char*a,const char*b,byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)
boolean stato;

Serial.println(a);
Serial.println(b);
for (byte i=0;i<k+1;i++){
if (a[i]!=b[i]){stato=false;break;}  //se trova un char diverso, blocca la ricerca e restituisci falso
                        }
Serial.println(stato);
if(stato){return 1;}
else{return 0;}

}



Mi restituisce sempre falso anche quando i due array sono uguali:cosa sbaglio???
Grazie

Ciao! Forse ti può essere utile questa lettura:
https://www.arduino.cc/en/Tutorial/StringComparisonOperators

I consigli di Patrick_M sono gli stessi che avrei scritto anche io, diciamo che la funzione la scriverei così (non userei const, ed il nome di funzione dovrebbe in genere iniziale in minuscolo, per convenzione):

void setup()
{
  Serial.begin(9600);
  Serial.println(confronta("pippo","pippopluto", 5));
  Serial.println(confronta("pippo","pippopluto", 4));
  Serial.println(confronta("poppo","pippopluto", 5));
}

void loop()
{
}

bool confronta(char *a, char *b, byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)
  bool stato = true;
  for (byte i=0;i<k;i++)
    stato &= (a[i]==b[i]);
  return(stato);
}

Questo test dovrebbe darti 1 1 0 (ossia solo i primi 2 confronti sono positivi).

EDIT: propifol mi ha in parte anticipato, ma il mio codice è più compatto del suo :smiley: :smiley:

propifol:
Ciao! Forse ti può essere utile questa lettura:
https://www.arduino.cc/en/Tutorial/StringComparisonOperators

Direi di no in quanto quella pagina tratta la classe String e non gli array di char.
E come ormai ripetaimo da molto tempo la Classe string su Arduino è il male assoluto nel 9,99% dei casi (per non dire il 100%)

Me per curiosità @manolomao, questa cosa la stai facendo a scopo didattico per prendere dimestichezza con gli array? Perché altrimenti ci sono già funzioni adatte allo scopo...

@fabpolli penso/spero di si, male non fa comunque.. :wink:

Fabpolli, si sto studiando un po' l'uso e manipolazione degli array....
Funzioni adatte a questo scopo....puoi dirmi quali??
La libreria string non la leggo nemmeno...
grazie Patrick_M e docdoc....docdoc perchè non useresti cost??
più tardi provo e vedo come gira

Una su tutte strncmp confronta le stringhe ma da li in poi si apre un mondo di funzioni che copiano stringhe, parti di esse, ecc. ecc.

Docdoc, mi spieghi meglio come funziona quella riga stato &= (a[i]==b[i]);???
Secondo te/voi,(a parte la lettera maiuscola minuscola, di cui non sapevo) è giusto come ho scritto la funzione?? Nel senso, durante il ciclo for, appena trova una divergenza nel char,cambia valore la variabile e si interrompe con break....(scusate davvero l'ignoranza)....

fabpolli, ho guardato il link che mi hai messo....c'è un mondo, ma parla sempre di stringhe e libreria string.h...tranne che per strncmp che è comparazione dei caratteri delle due stringhe, proprio come voglio io....Ecco il mio dubbio è sempre quello: ma non si dice di evitare la libreria string.h??

manolomao:

stato &= (a[i]==b[i]);

E' l'operatore booleano su bit in questo caso l'AND sul bit, essendo stato booleano e quindi composto da un solo bit è come fare:

stato = stato && a[i]==b[i];

quando parti valorizzi stato a true (Che equivale a 1), man mano che confronti la stringa fai l'and sul bit tra stato e il confronto che che è uguale vale 1 quindi 1 and 1 da 1 ma se un carattere in una certa posizione è differente avrai 1 and 0 che da zero e da quel momento in poi qualiasi siano i caratteri successivi stato resterà a zero (and tra zero e zero o uno darà sempre zero) quindi la funzione restituirà false
Rispetto a quanto hai scritto tu la funzione di docdoc scansioen sempre tutta la stringa, mentre la tua esce alla prima occorrenza di un carattere differente, per fare la medesima cosa con la forma di docdoc puoi fare:

bool confronta(char *a, char *b, byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)
  bool stato = true;
  for (byte i=0; stato  && i<k;i++)
    stato &= (a[i]==b[i]);
  return(stato);
}

oppure con una forma meno compatta

bool confronta(char *a, char *b, byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)
  bool stato = true;
  for (byte i=0; i<k;i++)
  {
    stato &= (a[i]==b[i]);
    if(!stato)
    {
       break;
    }
  }
  return(stato);
}

oppure ancora

bool confronta(char *a, char *b, byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)
  bool stato = true;
  byte i=0 
  while (stato && i<k)
  {
    stato &= (a[i]==b[i++]);
  }
  return(stato);
}

manolomao:
fabpolli, ho guardato il link che mi hai messo....c'è un mondo, ma parla sempre di stringhe e libreria string.h...tranne che per strncmp che è comparazione dei caratteri delle due stringhe, proprio come voglio io....Ecco il mio dubbio è sempre quello: ma non si dice di evitare la libreria string.h??

E' un tranello in cui si casca facilmente la libreria standard C string.h è corretto usarla lavora solo ed esclusivamente su array di char è la classe String che va evitata come la peste, la prima è una libreria di funzioni la seconda è appunto una classe che ha i difetti ormai noti su MCU senza garbage collector

ottimo, ed io ci casco....
Quindi tutte le funzioni riportate in quel link le posso usare senza paura,giusto?

Esatto, in realtà per essere più precisi puoi usare tutte le funzioni definiti nel file string.h presente nella cartella d'installazione dell'IDE di Arduino, potrebbe esserci alcune differenze rispetto al sito di cui ho messo il link, con il file include vai sul sicuro

fabpolli:
E' l'operatore booleano su bit in questo caso l'AND sul bit, essendo stato booleano e quindi composto da un solo bit è come fare:

Hehehe, hai perfettamente descritto ciò che avrei spiegato io. Mi hai risparmiato la fatica, grazie! :smiley:

fabpolli:
E' l'operatore booleano su bit in questo caso l'AND sul bit, essendo stato booleano e quindi composto da un solo bit è come fare:

stato = stato && a[i]==b[i];

quando parti valorizzi stato a true (Che equivale a 1), man mano che confronti la stringa fai l'and sul bit tra stato e il confronto che che è uguale vale 1 quindi 1 and 1 da 1 ma se un carattere in una certa posizione è differente avrai 1 and 0 che da zero e da quel momento in poi qualiasi siano i caratteri successivi stato resterà a zero (and tra zero e zero o uno darà sempre zero) quindi la funzione restituirà false
Rispetto a quanto hai scritto tu la funzione di docdoc scansioen sempre tutta la stringa, mentre la tua esce alla prima occorrenza di un carattere differente, per fare la medesima cosa con la forma di docdoc puoi fare:

bool confronta(char *a, char *b, byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)

bool stato = true;
 for (byte i=0; stato  && i<k;i++)
   stato &= (a[i]==b[i]);
 return(stato);
}



oppure con una forma meno compatta


bool confronta(char *a, char *b, byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)
 bool stato = true;
 for (byte i=0; i<k;i++)
 {
   stato &= (a[i]==b[i]);
   if(!stato)
   {
      break;
   }
 }
 return(stato);
}



oppure ancora


bool confronta(char *a, char *b, byte k){  // Confronta(primo array,secondo array,numero dei char da confrontare)
 bool stato = true;
 byte i=0
 while (stato && i<k)
 {
   stato &= (a[i]==b[i++]);
 }
 return(stato);
}

Grazie,sempre molto gentile e chiaro!!
Grazie a voi ho imparato qualcosa in più...

Un consiglio :slight_smile: delle varie funzioni stringa del C si trovano implementazioni online, si trovano dei sorgenti online. Basta fare ricerche del tipo "strncmp() source code" o "strcmp implementation in c", visionarle è una cosa molto istruttiva, ti insegna a operare con le stringhe nel modo migliore e COSA INTERESSANTE
ti mostra che per uno stesso risultato i programmatori si "inventano" soluzioni diverse, quindi trovi tante soluzioni a uno stesso problema :slight_smile:

Grazei a tutti per i consigli, funziona alla grande e credo di aver imparato qualcosa in più...
PS @Docdoc, perchè non usare una const char all'interno della funzione??