Come usare sscanf nei cicli?

di il
5 risposte

Come usare sscanf nei cicli?

Buongiorno.

Ho la necessità di leggere una serie di caratteri e/o numeri contenuti in una variabile stringa di caratteri di cui non si conosce il numero di elementi e memorizzarli poi in un vettore di interi. Tale variabile stringa si trova in memoria (per inciso, se i dati si trovano in un file di testo su disco, l'operazione viene svolta molto semplicemente con l'uso di fscanf).

Ho trovato in rete il seguente esempio, che potrebbe fare al caso mio:

#include <stdio.h>

int main(void)
{
    char line[] = "100 185 400 11 1000";
    char *data = line;
    int offset;
    int n;
    int sum = 0;

    while (sscanf(data, "%d%n", &n, &offset) == 1)
    {
        sum += n;
        data += offset;
        printf("read: %5d; sum = %5d; offset = %d\n", n, sum, offset);
    }

    printf("sum = %d\n", sum);
    return 0;
}

dove si utilizza %n all'interno del formato di sscanf (mai visto fare prima d'ora), ma si accenna al fatto che sia anche un fattore di rischio.

In che tipo di rischio ci si imbatte nel caso di un suo utilizzo?
Esiste eventualmente un modo diverso da quello esposto per usare sscanf in un ciclo?

5 Risposte

  • Re: Come usare sscanf nei cicli?

    Perché non usi semplicemente la funzione

    strtok 

    ?

  • Re: Come usare sscanf nei cicli?

    19/05/2023 - euscar ha scritto:


    In che tipo di rischio ci si imbatte nel caso di un suo utilizzo?

    Immagino ci sia il potenziale per un buffer overflow, quando si gestiscono stringhe più lunghe del buffer previsto. 

    Ti hanno già consigliato ottimamente strtok e strsep in caso. Se sei obbligato al c/c++ la gestione delle stringhe è uno dei capisaldi di difficoltà alta. Se utilizzassi python o java ti semplificheresti la vita enormemente ma immagino tu non passa scegliere il linguaggio.

  • Re: Come usare sscanf nei cicli?

    19/05/2023 - oregon ha scritto:


    Perché non usi semplicemente la funzione

    strtok 

    ?

    Non conoscevo tale funzione. Ora sì, grazie a te ;)

    Comunque ho fatto delle prove partendo dal seguente esempio trovato su cplusplus.com:

    /* strtok example */
    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {
      char str[] ="- This, a sample string.";
      char * pch;
      printf ("Splitting string \"%s\" into tokens:\n",str);
      pch = strtok (str," ,.-");
      while (pch != NULL)
      {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
      }
      return 0;
    }

    Però se sostituisco la definizione della stringa

    char str[] ="- This, a sample string.";

    con quest'altra (le mie stringhe sono per forza di cose puntatori di char, non dipende da me):

    char *str ="- This, a sample string.";

    non funziona più.

    Purtroppo non ho mai approfondito bene la gestione delle sringhe in C avendo trattato principalmente algoritmi numerici e mi sto rendendo conto che, come riferito da alfredo.centinaro, sono di difficile gestione.

    @alfredo.centinaro
    E sì, pur essendo un lavoro ad uso personale, per ora sono vincolato al C.

  • Re: Come usare sscanf nei cicli?

    Non

    char *str

    ma

    char str[]

  • Re: Come usare sscanf nei cicli?

    Grazie oregon per le dritte.
    Finalmente sono riuscito a farlo funzionare.

    Ho avuto ancora qualche difficoltà perché nel mio caso l'istruzione di estrazione doveva essere così:

    num = strtok(NULL, " \n\r");

    avendo da escludere lo spazio e il return … che bello è imparare cose nuove :)

Devi accedere o registrarti per scrivere nel forum
5 risposte