Ricavare ultimo carattere di una stringa

Salve, mi scuso fin da subito perché mi rendo conto che la domanda è banale ma ho cercato molto prima di arrivare ad aprire un nuovo topic, ovviamente senza esito.
Praticamente dovrei prelevare l’ultimo carattere di una stringa, che può variare di volta in volta in lunghezza.
Oppure andrebbe bene anche prelevare il carattere successivo ad un simbolo specifico (es. / o -).
Che funzioni dovrei usare?

Dacci lo sketch che stai usando. Ciao Uwe

Guarda, un minimo di teoria in 'C' la stringa è un array di caratteri, con l'ultimo carattere obbligatoriamente composto da uno 0 in 'C' è impossibile conoscere la lunghezza di un array (se non in sede di creazione dello stesso) per fortuna in 'C' hanno aggiunto delle funzioni che "cercano" il codice 0 in fondo ad un array di caratteri e lo "riconoscono" come "fine stringa" quindi il carattere che cerchi, se esiste, è l'elemento dello array di indice inferiore di uno alla lunghezza della stringa ovvero, posto che il nome della variabile stringa sia nome a te serve:

nome[strlen(nome)-1]

limiti di questa soluzione: 1) se la stringa fosse nulla non restituisce il valore corretto 2) se la stringa non fosse correttamente terminata non restituisce il valore corretto 3) è talmente semplice che non è che uno te lo dovrebbe dire, fa parte del normale bagaglio di un programmatore, forse è il caso che tu ti legga un buon libro, prima di mettersi a pasticciare con cose da 21° secolo come i broker MQTT sarebbe bene di conoscere almeno un minimo le basi, uno non si mette in 5° in autostrada in corsia di sorpasso prima di sapere da che parte ha il bocchettone del serbatoio, non trovi? io ti consiglio, come tutti qui, il buon K&R, magari la seconda edizione italiana, se non mastichi bene l'inglese io ho questa: Linguaggio C, Gruppo Editoriale Jackson, ISBN 88-7056-443-6 ma credo piu' facile trovare in commercio questa: Il Linguaggio C, Pearson Education Italia, ISBN 88-7192-200-X

Standardoil: ... in 'C' è impossibile conoscere la lunghezza di un array (se non in sede di creazione dello stesso) ...

... emmm ... e la sizeof() che l'hanno scritta a fare ? ? ? :o

Esempio pratico ...

int a[17];
size_t n = sizeof(a)/sizeof(a[0]);

... n contiene il numero degli elementi dell'array, oppure

int a[17];
size_t n = sizeof(a);

... n contiene la dimensione in byte di tutto l'array

Guglielmo

Ciao! Se parli di stringhe stile C "array di char", puoi usare la funzione strlen() per ricavare il numero di caratteri, e poi accedere all'ultimo carattere dell'array. Siccome gli array partono da indice zero, l'ultimo carattere si trova a strlen()-1.

char s[]="mia stringa";
char ultimoCarattere= s[strlen(s)-1];

Se invece stai usando oggetti String del C++, esistono metodi appositi. length() per ottenere la lunghezza, e substring() per prelevare una sottostringa.

Per Guglielmo Hai "formalmente" ragione. Però stai truccando... Perché in 'C' la sizeof non è strettamente parlando una funzione, e restituisce il risultato corretto solo nel campo di visibilità (scope) dove hai creato lo array, altrimenti riporta la dimensione del puntatore allo array E nel campo di visibilità dove ho creato lo array la sua dimensione la conosco già... Inutile farla ri-calcolare subito Infatti se si passano array si passa anche la loro dimensione Ne abbiamo discusso pochi giorni fa, che invece in c++ qualcosa del genere si può fare...

Standardoil: Hai "formalmente" ragione Però in 'C' la sizeof non è strettamente parlando una funzione, e restituisce il risultato corretto solo nel capo di visibilità (scope) dove hai creato lo array, altrimenti riporta la dimensione del puntatore allo array

HO RAGIONE, STOP ! :smiling_imp: Il resto sono ovvietà, se la variabile NON è visibile ovvio che non puoi usare certe cose ...

Guglielmo

Certo, hai ragione
Lascia pure che lo OP ci provi, allo stato brado, e poi vediamo quanto tempo ci mette a domandare perché la sua funzione appena scritta non va…
Glielo spiegherai tu, vero?, visto che hai ragione…

Standardoil: Certo, hai ragione Lascia pure che lo OP ci provi, allo stato brado, e poi vediamo quanto tempo ci mette a domandare perché la sua funzione appena scritta non va... Glielo spiegherai tu, vero?, visto che hai ragione...

Senti, hai scritto 'na fregnaccia (e te l'ho evidenziata nel mio reply) quindi ora nun t'arampica' sugli specchi! :stuck_out_tongue_closed_eyes: In 'C' È possibile conoscere le dimensioni di un array ed è ampiamente documentato come e quando ovunque.

Ovvio che nella "visibilità" dell'array ... hai l'array su cui puoi operare, fuori della visibilità NON hai più un array, hai solo un POINTER ... e sei tu a sapere cosa ci vuoi fare !

E al OP glie lo spiego io ... tranquillo ! ;)

Guglielmo

Comunque, e "tagliamo la testa al toro", se uno facesse lo cose come si deve, il problema NON sussisterebbe ... ... basterebbe che, invece di mettere la dimensione fissa nell'array (pessima pratica ... specie se devi cambiare poi qualche cosa), la si mettesse in una bella #define ... uno ce l'avrebbe sempre li a disposizione, senza fare tanti calcoli o peripezie :D

Ma so che la conoscenza del "preprocessor" è scarsa e la gente, spesso, neanche sa come utilizzarlo al meglio ... ::)

Guglielmo

Guglielmo, scusa se te lo dico, stiamo parlando di una stringa, non è che la crei esplicitamente... Di solito viene fatta una cosa del tipo:

char nome[] = "qualcosadascrivere";

non puoi usare una define....

Standardoil: ... non puoi usare una define....

Bhe ... si chiama "pigrizia" ... ma va bene, sintatticamnete è esatto ... con ciò che ne consegue ::)

#define NOME_LNG 19
char nome[NOME_LNG] = "qualcosadascrivere";

... e passa la paura :D :D :D

Tanto, se, come dicevi, poi quella stringa la vuoi passare come "parametro" di funzione ... la lunghezza ti serve e, o te la calcoli prima di passarla come su detto o usi la #define ... ;)

Guglielmo

Ma in una stringa c'è il terminatore proprio per evitare questo problema... :confused:

SukkoPera: Ma in una stringa c'è il terminatore proprio per evitare questo problema... :confused:

... strlen() ... come torn24 aveva detto poco sopra :D :D :D

Guglielmo

E io prima di lui se vogliamo fare i precisini...

Standardoil: Guarda, un minimo di teoria in 'C' la stringa è un array di caratteri, con l'ultimo carattere obbligatoriamente composto da uno 0 in 'C' è impossibile conoscere la lunghezza di un array (se non in sede di creazione dello stesso) per fortuna in 'C' hanno aggiunto delle funzioni che "cercano" il codice 0 in fondo ad un array di caratteri e lo "riconoscono" come "fine stringa" quindi il carattere che cerchi, se esiste, è l'elemento dello array di indice inferiore di uno alla lunghezza della stringa ovvero, posto che il nome della variabile stringa sia nome a te serve:

nome[strlen(nome)-1]

limiti di questa soluzione: 1) se la stringa fosse nulla non restituisce il valore corretto 2) se la stringa non fosse correttamente terminata non restituisce il valore corretto

Ti ringrazio per la spiegazione, perché alle volte, come d'altronde avevo anticipato, la cosa può sembrare banale per alcuni e trovare persone che spiegnino ad altre senza per forza far voler vedere il loro stato di preparazione (in un argomento, che poi nella vita magari si trovano dall'altro lato) sono sempre più rare.

Standardoil: 3) è talmente semplice che non è che uno te lo dovrebbe dire, fa parte del normale bagaglio di un programmatore, forse è il caso che tu ti legga un buon libro, prima di mettersi a pasticciare con cose da 21° secolo come i broker MQTT sarebbe bene di conoscere almeno un minimo le basi, uno non si mette in 5° in autostrada in corsia di sorpasso prima di sapere da che parte ha il bocchettone del serbatoio, non trovi?

Per questa precisazione permettimi di dissentire. Come già accennato, ad apertura di topic, ho evidenziato il fatto che la cosa fosse banale, e una lettura più attenta avrebbe evidenziato non una richiesta di soluzione, ma solo una richiesta di indirizzamento. L'approccio alla programmazione cosi come per la guida non per forza deve avvenire come descritto da te. Uno può anche scegliere di iniziare a portare la macchina in un parcheggio dove non rischia di far male a qualcuno se non a lui stesso o al suo portafoglio (come d'altronde fanno fare quelli della scuola guida prima di portarti sulla corsia di sorpasso in autostrada).

Parli di normale bagaglio di programmatore, ma dubito che uno riesca a conoscere tutte le funzioni che il 'C' mette a disposizione. Per questo uno si documenta o chiede a chi è più esperto di lui, quando la prima soluzione non va a buon fine.

Seguendo sempre il tuo ragionamento, quindi te avresti dovuto leggere l'intero vocabolario della lingua italiana prima di poter scrivere qui?!

Standardoil: Certo, hai ragione Lascia pure che lo OP ci provi, allo stato brado, e poi vediamo quanto tempo ci mette a domandare perché la sua funzione appena scritta non va... Glielo spiegherai tu, vero?, visto che hai ragione...

Le considerazioni personali non sono utili. Invito a rispondere per lo stato dei fatti cosi come sono, non per come uno pensa che saranno.

torn24: Ciao! Se parli di stringhe stile C "array di char", puoi usare la funzione strlen() per ricavare il numero di caratteri, e poi accedere all'ultimo carattere dell'array. Siccome gli array partono da indice zero, l'ultimo carattere si trova a strlen()-1.

char s[]="mia stringa";
char ultimoCarattere= s[strlen(s)-1];

Se invece stai usando oggetti String del C++, esistono metodi appositi. length() per ottenere la lunghezza, e substring() per prelevare una sottostringa.

Grazie mille torn24. Si, attualmente stò utilizzando String però conto di convertire tutto ad array di caratteri del C anche per un discorso di leggerezza (spero di non dire fesserie).

Ci tenevo a ringraziare tutti perché, anche se per diversi motivi, sono uscite informazioni preziose da cui partire per documentarsi.

Marco80: Si, attualmente stò utilizzando String

Comunque l'ultimo carattere di una stringa di tipo String è:

String nome = "Mario"; Serial.println(nome.substring(nome.length() - 1));

però conto di convertire tutto ad array di caratteri del C anche per un discorso di leggerezza (spero di non dire fesserie).

Le String sono il male assoluto quindi fai bene! ;)

docdoc: Comunque l'ultimo carattere di una stringa di tipo String è:

String nome = "Mario"; Serial.println(nome.substring(nome.length() - 1));

Mi sembra di capire che così funziona anche se la Stringa è variabile in lunghezza, giusto?

Si, funziona con qualunque lunghezza della stringa.

Serial.println(nome.substring(nome.length() - 1));

Dice prendi la sottostringa "substring", da lunghezza della stringa "length" -1 fino alla fine della stringa. calcola la lunghezza della stringa, toglie uno e va all'ultimo carattere, e poi preleva la sottostriga.