Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] - che tipo di dato mi serve?

    Ciao, mi serve in C una stringa di lunghezza n, n non definito, che contenga solo {0,1}.
    Posso usare un tipo di dati particolare (es. binario) o devo avere una lista di boolean per forza?!?
    Non voglio che la stringa "0010" diventi "10", ma devo leggere anche i primi due caratteri...

    si è capito?!?
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non puoi semplicemente utilizzare un puntatore a carattere (una comunissima stringa), che tu, poi, andrai a popolare con i caratteri che ti servono?
    Per allocare la stringa in fase di esecuzione (senza conoscerne a priori la dimensione) puoi utilizzare la funzione malloc():
    codice:
    char *stringa;
    int lunghezza;
    ...
    
    // Leggo (ad esempio da tastiera) la lunghezza della stringa
    scanf("Digita la lunghezza: ", &lunghezza);
    
    // ora dimensiono la mia stringa:
    stringa = (char*) malloc(lunghezza * sizeof(char));
    Per far sì che nella stringa entrino solamente caratteri 0 o caratteri 1, puoi utilizzare una semplice funzioncina, che controlla il tipo di carattere che andrai ad aggiungere:
    codice:
    int controlla(char c) {
       return ((c == '0') || (c == '1'));
    }
    ...
    char carattere;
    ...
    // 'carattere' ora contiene un possibile carattere da aggiungere
    // controllo che esso sia 0 oppure 1:
    if (controlla(carattere)) {
       stringa++ = carattere;
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Originariamente inviato da LeleFT
    Non puoi semplicemente utilizzare un puntatore a carattere (una comunissima stringa), che tu, poi, andrai a popolare con i caratteri che ti servono?
    Per allocare la stringa in fase di esecuzione (senza conoscerne a priori la dimensione) puoi utilizzare la funzione malloc():
    codice:
    char *stringa;
    int lunghezza;
    ...
    
    // Leggo (ad esempio da tastiera) la lunghezza della stringa
    scanf("Digita la lunghezza: ", &lunghezza);
    
    // ora dimensiono la mia stringa:
    stringa = (char*) malloc(lunghezza * sizeof(char));
    ...e se al posto di chiedere quanto è lunga la stringa faccio una strlen(dato) e ne ottengo la lunghezza è fattibile?
    grande idea questa!
    E' un punto di partenza, ma migliorare ancora no? Altrimenti ho già detto, così non è male!
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Dipende... se hai detto che la lunghezza non la conosci a priori non vedo come tu possa utilizzare la strlen... se invece il dato lo ottieni da riga di comando (args[1]), allora è fattibilissimo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Originariamente inviato da teju
    ...e se al posto di chiedere quanto è lunga la stringa faccio una strlen(dato) e ne ottengo la lunghezza è fattibile?
    grande idea questa!
    E' un punto di partenza, ma migliorare ancora no? Altrimenti ho già detto, così non è male!
    Ho scritto una boiata assurda!!
    Non posso fare una strlen() di un dato che ancora non conosco e che mi deve arrivare da tastiera!!!

    Cmq: NON POSSO chiedere la lunghezza precedentemente!
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Osserva il mio post appena sopra...

    Se il dato ti arriva da tastiera, ad esempio così:
    codice:
    char *s
    
    scanf("%s", s);
    puoi usare la strlen() per conoscerne la lunghezza:
    codice:
    char *stringa = (char*) malloc(strlen(s) * sizeof(char));
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    65
    guarda l'allocazione dinamica della memoria l'ho fatta proprio oggi in università...


    int *puntatore;

    puntatore=malloc(sizeof(int)); //al puntatore va l'indirizzo della prima cella che hai allocato!

  8. #8
    Originariamente inviato da Ponza
    int *puntatore;

    puntatore=malloc(sizeof(int)); //al puntatore va l'indirizzo della prima cella che hai allocato!
    ciò significa che non ho bisogno di sapere a priori la lunghezza???
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    No... questa istruzione
    codice:
    puntatore = malloc(sizeof(int));
    alloca solamente lo spazio a contenere un intero. E' pur vero che, in minima quantità, si potrà andare a scrivere anche oltre la memoria allocata, ma solo fino ad un certo punto.
    Questo codice, ad esempio, non fa esattamente quello che ci si aspetta:
    codice:
    char *c, *d;
    int i;
    c = (char*) malloc(sizeof(char));
    d = c;
    for (i=0; i<100; i++) {
       *c++ = 'N';
    }
    printf("%s\n\n", d);
    Ci si aspetterebbe di vedere una sfilza di 100 caratteri 'N' a video... in realtà se ne vedono meno (io, compilando con Dev-C++ su una macchina PIII 450) vedo 16 'N' e poi un po' di caratteri insignificanti. Questo perchè l'istruzione
    codice:
    c = (char*) malloc(sizeof(char));
    ha riservato per il mio puntatore solamente 1 carattere ed io ho sconfinato lo spazio a me riservato.

    Modificando, invece, l'allocazione in questo modo:
    codice:
    c = (char*) malloc(100 * sizeof(char));
    chiedo di riservare 100 byte e in questo modo a video vedrò esattamente la sfilza di 100 caratteri 'N'.

    Questo significa che, comunque, devi risalire alla lunghezza se vuoi riservare sufficiente spazio per contenere la stringa.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.