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
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
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
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, 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
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??
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 classeString 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
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:
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 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
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??