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