Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    5

    Domanda Acquisizione Stringa In C Per Esperti !!!

    Devo acquisire una stringa in C da linea di comando, ma se uso la scanf su una stringa devo dichiarare un array di un numero di caratteri prefissato allocando memoria anche se in alcuni casi protrebbe non bastare o essere troppa.
    char a[128];
    scanf("%s", a);


    Con scanf("%s", a) dove a è un puntatore a char ho notato che dopo questa istruzione il puntatore a si comporta come una stringa e dovrebbe usare la memoria allo stretto necessario.
    char *a;
    scanf("s", a);

    Si può fare la scansione su un puntatore o ha degli inconvenienti ?(devo realizzare questo per un progetto universitario e devo stare attento agli sprechi di memoria).

    La mia domanda cioè è: è possibile acquisire una stringa da linea di comando allocando precisamente la memoria necessaria ?

  2. #2
    Con scanf("%s", a) dove a è un puntatore a char ho notato che dopo questa istruzione il puntatore a si comporta come una stringa e dovrebbe usare la memoria allo stretto necessario.
    char *a;
    scanf("s", a);
    In inglese lo chiamano "pure evil" .. ti lascio immaginare il perché! 'a' punta a _non_si_sa_cosa_!
    Per avere una stringa di lunghezza minima indispensabile dovresti fare un input carattere per carattere ed allocare un nuovo char ad ogni input. Noterai che questa soluzione è però meno efficiente, e in genere non si usa. Piuttosto, scanf() potrebbe provocare buffer overflow, quindi usa fgets().

  3. #3
    eccoti una funzione che uso di solito in casi critici:

    char *acquirestr(void);

    char *acquirestr() {

    int i = 1, ch;
    char *str;

    str = (char*)calloc(i, sizeof(char));

    while ((ch = getchar()) != '\n') {
    str = (char*)realloc((char*)str, ++i * sizeof(char));
    str[i - 2] = ch;
    }

    return str;
    }


    Penso faccia proprio a caso tuo. Funziona cosi:

    int f() {
    char *stringa;

    stringa = acquirestr();
    /* e a questo punto acquisisci la stringa*/

    ...
    free(stringa); /* come vedi non devi scordarti di deallocare */
    }


    In C++ puoi usare l'implementazione del tuo ambiente di sviluppo della classe string o usare quella della standard library.

    Good luck,
    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  4. #4
    DeGreitUorld .. Mi viene un dubbio .. se ad es. si tornasse indietro col backspace? La cosa credo si "complichi" ..

  5. #5
    E te pareva che solo a te poteva venire un dubbio cosi demente :*

    getchar() ti fa vedere i caratteri solo dopo che hai premuto invio. Questo e' quello che succede, inputtando una stringa:

    caaaaaaaaaaaaaaaaane<invio>

    Ora parte l'analisi del programma. Ammetto che in questo periodo sto rincoglionendo non poco, pero' ancora devo diventare cosi stupido :-D

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    100
    Salve mi potraste aiutare su questo problema? si tratta anche per me di un esame all'università.
    Devo leggere due stringhe S e T e devo determinare il numero di volte e le posizioni in cui S è contenuta in t.
    Qualcuno mi sa dire come si fa?
    IL LINGUAGGIO è IL C!

  7. #7
    Risparmiati commenti cretini.. :zamm:

    Intendo dire, con getchar() pensavo (ragionevolmente) che un backspace potesse essere preso anche come input, come un escape. Cmq ho verificato e il problema non si pone. :adhone:

    Ciao gheio.

  8. #8
    Il puntatore restituito da realloc non è detto sia lo stesso puntatore passato come argomento, e se la realloc fallisce il puntatore originale non viene liberato, inoltre un flusso di input potrebbe finire con EOF invece di '\n', in tal caso il programma si bloccherebbe.

    Buona noce a tutti.

  9. #9
    Non viene assicurato che sia lo stesso, ma che la memoria in eccesso venga liberata si. O almeno questo è quanto fa gcc e quello che dovrebbe fare un qualsiasi buon compilatore. In alternativa si potrebbe fare una propria rappresentazione di realloc() che assicuri queste features ma sinceramente non ho visto compilatori che lavorino in modo cosi tarocco neanche su windows, quindi....

    bye

    p.s.: ah, per l'EOF basta mettere un controllino in più...

    while (((ch = getchar()) != '\n') || (ch != EOF))...

    cmq hai fatto bene a notarlo
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  10. #10
    Non volevo farlo notare a te, lo sapevo che tu lo sapevi, solo che magari al nostro amico interlocutore poteva essere tratto in fallo, visto che anch'io a volte posto degli esempi incompleti, dando per scontato che chi legge capisca che deve fare i check degli errori di allocazione, e che capisca che si tratta solo di un esempio, invece magari provano a compilarlo per davvero.

    L'MSDN e il Kernighan Ritchie su realloc dicono che quando fallisce restituisce NULL e il blocco originale non viene liberato.

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.