Lavorare con cstring.
Le funzioni ei metodi della classe String sono comunemente usati per lavorare con le stringhe, anche se sprecano memoria. Le stringhe da array di elementi char ti consentono di controllare quasi ogni byte e per lavorare con loro c'è un numero sufficiente di funzioni che devi solo applicare correttamente. In questo studio, una stringa viene analizzata utilizzando le funzioni di base delle stringhe. Innanzitutto uno schizzo (ha alcuni passaggi aggiuntivi, ma dovrebbe essere più chiaro per i principianti):
Decrittazione:
char patriotic_war[] = "22.06.1941 - 9.5.1945"; - calcolare il numero di giorni tra le date dalla stringa allegata. La soluzione è semplice: traduciamo la stringa in numeri, calcoliamo il numero di giorni dall'anno zero a ciascuna data e calcoliamo la differenza tra di loro.
char *ptr1, *ptr2, str_temp[15]; - per funzionare, avrai bisogno di due puntatori e una stringa ausiliaria (la sua lunghezza è calcolata end-to-end).
ptr1 = strchr(patriotic_war, '.'); - cerca il primo punto nella stringa usando la funzione strchr().
if (ptr1 == NULL) { Serial.println("error"); return; } - se non viene trovato nulla, stampiamo "error" ed esci, in questo caso uscendo da setup().
number = ptr1 - patriotic_war; - calcola il numero di caratteri da copiare nella stringa ausiliaria.
strncpy(str_temp, patriotic_war, number); - copia il numero di caratteri richiesto usando la funzione strncpy().
str_temp[number] = 0; - poiché la funzione strncpy() non inserisce un carattere nullo alla fine della stringa dopo la copia, lo inseriamo noi stessi.
day = atoi(str_temp); - ottenere un valore numerico dalla stringa ausiliaria.
ptr2 = strchr(ptr1 + 1, '.'); - cerca il secondo punto della stringa.
number = ptr2 - ptr1 - 1; strncpy(str_temp, ptr1 + 1, number); - copia dal carattere successivo dopo il puntatore, quindi ptr1+1, per questo motivo il numero di caratteri copiati number diminuisce di 1.
ptr1 = ptr2; - passaggio dell'indirizzo da un puntatore all'altro (facoltativo, fatto per facilitare la comprensione dello schizzo).
ptr2 = strstr(ptr1 + 1, " - "); - usando la funzione strstr(), cerchiamo la sottostringa " - " nella stringa, il puntatore riceverà l'indirizzo del primo elemento da cui la sottostringa entra nella stringa - nel nostro caso, questo è l'elemento immediatamente dopo il 1941.
number = ptr2 - ptr1 - 1; strncpy(str_temp, ptr1 + 1, number); str_temp[number] = 0; year2 = atoi(str_temp); - copia il numero richiesto di caratteri e ottenere un numero da essi.
if (month2 < 3) {month1 = month2 + 9; year1 = year2 - 1;} else {month1 = month2 - 3; year1 = year2;} - manipolazioni ausiliarie per i calcoli.
day_number1 = 64 + day + (153 * month1 + 2) / 5 + 365L * year1 + year1 / 4 - year1 / 100 + year1 / 400; - la formula per calcolare il numero di giorni dalla prima data dell'anno zero è presa dai vecchi tempi delle calcolatrici programmabili e leggermente convertita per l'aritmetica intera del microcontrollore.
day_week = day_number1 % 7 + 1; - allo stesso tempo calcola il giorno della settimana per la data di ricezione: 1 corrisponde a lunedì, 7 - a domenica.
sprintf(str_temp, "%02i.%02i.%04i = %i", day, month2, year2, day_week); - usando sprintf(), trasformiamo un output formattato della data e del giorno della settimana ricevuti in una stringa temporanea.
strncpy(str_temp, ptr1 + 3, number); - cerca il terzo punto della stringa.
ptr2 = strchr(ptr1 + 1, '.'); - cerca il quarto punto della stringa. Un risultato simile può essere ottenuto usando la funzione strrchr(patriotic_war, '.') trovando l'ultimo punto nella stringa.
strcpy(str_temp, ptr2 + 1); - usando la funzione strcpy(), copia semplicemente il resto della stringa. Nel nostro caso, non è possibile copiare, ma utilizzare immediatamente atoi(ptr2+1).
Serial.print("date2 - date1 = "); Serial.println(day_number2 - day_number1); - mostra l'intervallo tra le date. Problema risolto!
