Funzione memmem

di il
14 risposte

Funzione memmem

Salve a tutti, è da pochi mesi che ho deciso di imparare il linguaggio c, ma nel andare avanti ho riscontrato un problema nell’utilizzo della funzione memmem(di qui so il prototipo che però non riesco a sfruttare). A questo punto volevo chiedervi se potevate spiegarmi il funzionamento di questa funzione facendo anche esempi pratici dentro un programma senza dare nulla che riguardi la funzione per scontato. Grazie in anticipo!

14 Risposte

  • Re: Funzione memmem

    1) che cosa non capisci dalla documentazione?
    2) a meno che tu non sia OBBLIGATO a imparare il C per motivi di lavoro, lascialo perdere, meglio Python.
  • Re: Funzione memmem

    1) della documentazione non capisco come debba applicare il prototipo della funzione a nessuno scopo non ho proprio capito come usarlo praticamente penso che per capirlo mi basterebbe vederlo in un programma.
    2)il linguaggioli lo sto imparando per mia volontà, e infatti dopo il c avevo intenzione di imparare il Python.
  • Re: Funzione memmem

    Dato che il forum non funziona come un docente privato o un corso online, è meglio che tu dica cosa pensi che faccia quella funzione; come si usa, un codice che hai provato e cosa non va. Anche qualche tua riflessione è importante e poi si discute/corregge/chiarisce quello che non va.
  • Re: Funzione memmem

    Il fatto è che non ho specificato perché non ci ho capito molto.
    Io so che la funzione “memmem” ha un prototipo del genere:
    
    Void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen);
    

    Di conseguenza, seguendo anche la spiegazione che ho, ho intuito che la funzione cerca la sequenza “needle” di lunghezza “needlelen” in “haystack” di lunghezza “haystacklen” e che ritorna un puntatore se trova la corrispondenza o un NULL se non la trova.
    Adesso prendendo anche in esame alcuni esempi online(ribadisco che non avevo e non ho capito come utilizzarla) ho scritto un programma del genere:
    
    #include <stdio.h>
    #include <string.h>
    int main() {
        int b,c;
        char *j;
        printf(“-Quanti byte deve avere la stringa A: “);
        scanf(“ %d”,&b);
        printf(“-Che valore devono contenere? “);
        scanf(“ %d”,&c);
        char a[b];
        char d[b-1];
        memset(a, c, b);
        memcpy(d, a, b);
        j = (char*) memmem(a,b,d,b);
        return 0;
    }
    
    Inseguito volevo scrivere un if che prendesse in esame il valore ritornato dalla memmem che nel caso fosse stato un NULL avrebbe scritto che non c’era corrispondenza della seconda stringa nella prima e viceversa nel caso fosse ritornato un puntatore.
    Penso di aver sbagliato praticamente tutto perché sono andato più a intuito.
    Grazie mille in anticipo.
  • Re: Funzione memmem

    Prima di tutto, hai capito a cosa serve la memmem? Nel tuo esempio quale sottostringa stai cercando e in quale stringa? Ad esempio, metti in una stringa la parola

    "caramella"

    e cerca la stringa

    "rame"
  • Re: Funzione memmem

    In questo momento non ho la possibilità di scrivere il programma appena potrò lo farò.
  • Re: Funzione memmem

    Bene...
  • Re: Funzione memmem

    
    #include <stdio.h>
    #include <string.h>
    int main() {
        char a[] = “caramella”;
        char b[] = “rame”;
        char *j; 
        j = (char*) memmem(a,9,b,4);
        if(j != NULL) 
            printf(“\n-la stringa B e\’ contenuta in A”);
        else
            printf(“\n-la stringa B non e\’ contenuta in A”);    
        return 0;
    }
    E mi da l’errore:
    
    ‘memmem’ was not declared in this scope
    
    Stesso errore mi viene dato anche nel programma che le ho mandato prima.
    Per questo penso di non aver capito come usare la funzione.
  • Re: Funzione memmem

    La memmem non è una funzione standard (perché la studi?) ... il tuo compilatore e le librerie installate probabilmente non la supportano.

    Utilizza la strstr
  • Re: Funzione memmem

    Ah, ti ringrazio molto. Nel mio libro non avevano specificato il fatto che non fosse in una libreria standard per questo la stavo studiando. Ma quindi la strstr fa la stessa cosa anche su stringhe non testuali?
    In ogni caso la ringrazio per il suo aiuto è già la seconda volta che mi risolve i problemi grazie.
  • Re: Funzione memmem

    patone ha scritto:


    Ah, ti ringrazio molto. Nel mio libro non avevano specificato il fatto che non fosse in una libreria standard per questo la stavo studiando. Ma quindi la strstr fa la stessa cosa anche su stringhe non testuali?
    In ogni caso la ringrazio per il suo aiuto è già la seconda volta che mi risolve i problemi grazie.
    Che significa stringhe non testuali? Comunque questo è il prototipo:
    char *strstr(const char *haystack, const char *needle)

    dove needle è la stringa da cercare in haystack. Nota che si parla esplicitamente di stringhe per cui in C non sono altro che array di char col terminatore apposito.
    Mentre per la memmem haystack è un puntatore generico ad un'area di memoria, anche se non è una funzione standard è facilmente implementabile usando memcmp opportunamente.
  • Re: Funzione memmem

    Ah ok, proverò con memcmp, comunque grazie anche a lei.
  • Re: Funzione memmem

    "memmem" FA PARTE della libreria 'standard', ma bisogna vedere QUALE standard.

    in "string.h" (Cygwin):
    
    #if __GNU_VISIBLE
    void *	 mempcpy (void *, const void *, size_t);
    void *	 memmem (const void *, size_t, const void *, size_t);
    void *	 memrchr (const void *, int, size_t);
    void *	 rawmemchr (const void *, int);
    #endif
    
    ma anche in Linux:
    
    #ifdef __USE_GNU
    /* Find the first occurrence of NEEDLE in HAYSTACK.
       NEEDLE is NEEDLELEN bytes long;
       HAYSTACK is HAYSTACKLEN bytes long.  */
    extern void *memmem (const void *__haystack, size_t __haystacklen, const void *__needle, size_t __needlelen) __THROW __attribute_pure__ __nonnull ((1, 3));
    
    /* Copy N bytes of SRC to DEST, return pointer to bytes after the last written byte.  */
    extern void *__mempcpy (void *__restrict __dest, const void *__restrict __src, size_t __n) __THROW __nonnull ((1, 2));
    extern void *mempcpy (void *__restrict __dest, const void *__restrict __src, size_t __n) __THROW __nonnull ((1, 2));
    #endif
    
    
  • Re: Funzione memmem

    Che standard esattamente? Che io sappia è solo uma estensione di GNU
Devi accedere o registrarti per scrivere nel forum
14 risposte