Go Down

Topic: Funzione di confronto array char (Read 772 times) previous topic - next topic

fabpolli

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

docdoc

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! :D
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

manolomao

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:
Code: [Select]

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:
Code: [Select]

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
Code: [Select]

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
Code: [Select]

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ù...

torn24

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 :)

manolomao

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??

torn24

#20
Nov 06, 2018, 08:24 am Last Edit: Nov 06, 2018, 08:33 am by torn24
Come ho detto esistono diverse soluzioni per uno stesso problema! Ci sono soluzioni migliori di altre, la soluzione mostrata da docdoc è migliore di quello che volevi fare tu :)

Però anche il tuo approccio è una possibile soluzione, solo con qualche modifica

1) confronto carattere per carattere
2) se trovo uno diverso restituisco 0
3) se tutti i caratteri sono uguali restituisco 1



Tua funzione modificata

Code: [Select]



boolean Confronta( char*a, char*b,byte k){  
 
     for (byte i=0;i<k;i++){
         if (a[i]!=b[i])
             return false; // ho trovato un carattere diverso
     }

     return true; //il ciclo for è terminato non è uscito dalla funzione quindi tutti i carattere sono uguali
 
}



Standardoil

Per pura curiosità sono andato a vedere l'implementazione della strncmp
È pura poesia...
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

docdoc

PS @Docdoc, perchè non usare una const char all'interno della funzione??
Generalmente non uso le const, ma in questo caso non dovendo cambiare nulla delle stringhe puoi anche usare const.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Standardoil

E dove la metteresti la const?
Quello che passi alla funzione e il puntatore alla stringa, non la stringa
Puntatore può anche essere costante, ma la stringa no....
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Standardoil

Forse ho scritto una caxella
Magari stasera ci guardo bene
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

torn24

Mi hai fatto venire il dubbio perché const non l'ho mai usato :)
Ho provato su ideone un ide online, e se usi const su un puntatore a char rende immodificabile la stringa.

P.S. non uso mai const nei parametri di una funzione, sono io che scrivo la funzione e sono io che so che non vanno modificati i parametri ;) quindi lo trovo inutile :) :)

Standardoil

Si infatti
Const char * è costante la stringa
Char const * è costante il puntatore
Const char const * è puntatore costante a stringa costante
Comunque sono d'accordo con te: io scrivo la funzione, io evito di scrivere dove non devo...
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

SukkoPera

#27
Nov 06, 2018, 04:53 pm Last Edit: Nov 06, 2018, 04:56 pm by SukkoPera
Se devi fare una API per qualcun altro, difficilmente lui sa cosa può modificare e cosa no, da cui l'utilità di const.

Senza contare che il compilatore può mettere in atto varie ottimizzazioni, se sa che qualcosa non deve essere modificato (anche se i compilatori più furbi sono in grado di accorgersene da soli).

Infine, in C++ sono valide entrambe le espressioni:
Code: [Select]
const char *pippo;
char * const pippo;


Il primo vuol dire che ciò a cui il puntatore punta non è modificabile, il secondo che il puntatore stesso non è modificabile (ma ciò a cui punta sì).

Le due cose possono anche essere combinate, ottenendo un fantastico:
Code: [Select]
const char * const pippo;

Che ho pure usato da qualche parte in Webbino...
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Go Up