[Linuxtrent] Re: Quesito su stringhe
- From: Flavio Stanchina <flavio@xxxxxxxxxxxxx>
- To: linuxtrent@xxxxxxxxxxxxx
- Date: Wed, 1 Apr 2020 14:15:22 +0200
On 01/04/20 13:55, Giuseppe Sportelli wrote:
Ciao allora è un buffer che proviene da un socket tcp
che è composto da N righe di M campi.
Le righe sono separate da un "*" i campi da ",".
La funzione che ho postato riesce a dividere le righe con una funziona
analoga divido i campi in ogni riga.
Fin qui tutto chiaro.
Controlli a monte di aver ricevuto righe complete, vero? Perché un socket
TCP è uno stream, non ricevi "pacchetti" e non hai la certezza che l'ultima
riga sia completa.
Passo come parametri alla funzione un array di puntatori char, poiché
alcuni campi testuali non hanno una lunghezza fissa ma possono variare
(infatti è una descrizione di un prodotto).
Perfetto, ma quanti elementi ha l'array 't'? Perché non passi a
estrai_riga() il numero di elementi e le fai controllare di non sforare? Al
limite il numero di elementi può essere una costante (anche se lo
sconsiglierei), ma un controllo è INDISPENSABILE, altrimenti stai certo che
prima o poi arriveranno più dati di quelli che ti aspettavi ed esplode tutto.
Ma non hai risposto alla mia osservazione: l'array "char sep[]={'*'}" che
passi a strtok() non è una stringa perché non c'è un terminatore. Se
funziona lo stesso è fortuna, capirne il motivo è un utile esercizio per
avere chiaro perché certi bug non si manifestano finché qualcuno non
modifica una funzione ed aggiunge altre variabili.
L'ultima cosa lo sleep mi server per sincronizzare sul primo servere che fa
da tramite ad un altro server centrale per ricevere i dati in base alla
richiesta.
Non è mai un buon modo per sincronizzare cose, e comunque non lo metterei
di certo in una funzione generica che serve a spezzare le righe. Mettilo
all'esterno.
A presto.
Il giorno mar 31 mar 2020 alle ore 23:01 Flavio Stanchina
<flavio@xxxxxxxxxxxxx> ha scritto:
On 31/03/20 10:44, Giuseppe Sportelli wrote:
> Grazie infatti ho risolto così
> void estrai_riga(char* t[])
> {
> int j=0;
> char sep[]={'*'};
Ora che ci faccio caso: il parametro di strtok() con l'elenco dei
separatori deve essere una stringa. Quello che tu gli passi, ovvero
char sep[]={'*'};
non è una stringa, perché non ha un terminatore. È un array di un
carattere.
--
Ciao, Flavio
Those who do not understand Unix are condemned to reinvent it, poorly.
-- Henry Spencer
--
Per iscriversi (o disiscriversi), basta spedire un messaggio con OGGETTO
"subscribe" (o "unsubscribe") a
mailto:linuxtrent-request@xxxxxxxxxxxxx
Other related posts: