Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    91

    stringhe

    ciao, io dovrei fare un programma dove acquisire da tastiera un testo, tipo:

    char *testo;
    testo = (char*)malloc(sizeof(char));
    printf("inserire testo");
    scanf("%s", *testo);

    ho usato un puntatore a carattere perche non si sa il testo immesso dall'utente quanto possa essere lungo, puo esserlo 10, 100, 1000.

    il problema sta nel fatto che tramite la scanf riesco ad acquisire soltanto quello che e stato digitato fino allo spazio, ad es. se l'utente immette "ciao a tutti", il testo acquisisce soltanto "ciao".

    mi e stata consigliata la funzione

    ssize_t getline(char **buffer, size_t *n, FILE *stream)

    qualcuno saprebbe spiegarmela un po per favore?
    e piu precisamente:
    size_t *n va inserita la lunghezza dell'input, ma se non la conosco che inserisco?
    FILE *stream legge da file, ma io devo leggere da tastiera

    come dovrei fare?
    grazie mille!!!!

  2. #2
    Allora..
    Prima di tutto nella malloc sarebbe corretto passargli la grandezza giusta che deve assumere la stringa..
    La malloc è una funzione particolare che permette di riservare dello spazio di memoria per una varioabile o come in questo caso per una stringa.. Però naturtalmente la malloc deve sapere quanto spazio riservare ed è per questo che sizeof(char) non basta perche cosi riserveresti posto per un solo carattere e non una stringa..
    Quindi la cosa migliuore sarebbe fare sizeof(char)*100 dove 100 è il numero di posti che ho riservato in memoria per la stringa..
    Per quanto riguarda l'acquisizione di una stringa con spazi compresi, puoi usare la funzione gets(stringa).
    Questa funzione ti acquisisce una stringa.. al posto di stringa metti la tua stringa.. senza *..

    P.s.

    La scanf come secondo argomento prende la variabile da riempire.. ma vuole sapere l'indirizzo .. ed è per questo che non devi passare la variabile con l'* ma la devi passare senza..

    Dimmi se ti funziona..

    ciao ciao
    "Penso che nel mondo ci sia mercato per quattro o cinque computer"... Thomas Watson, presidente della IBM, 1943

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    L'input e output in C nella stdlib funziona tramite gli stream.
    I file si aprono con gli stream
    codice:
    FILE *file = fopen(...)
    Ma anche il video e la tastiera sono degli stream,forse non te ne eri mai accorto
    per la tastiera si chiama stdout e il video stdin.
    Quindi quando ti chiede file, scrivici stdin.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    91
    grazie mille, l'ho provata e funziona

    solo che in fase di compilazione mi da il messaggio:
    warning: the 'gets' function is dangerous and should not be used. VVoVe:

    che significa?

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    La funzione è pericolosa e non dovrebbe essere usata.
    E' una funzione di livello molto basso e perciò ti avverte. Che compilatore usi?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Originariamente inviato da XWolverineX
    [...]
    per la tastiera si chiama stdout e il video stdin.
    [...]
    Hem...
    per la tastiera si chiama stdin e il video stdout.

    Originariamente inviato da dados881
    grazie mille, l'ho provata e funziona

    solo che in fase di compilazione mi da il messaggio:
    warning: the 'gets' function is dangerous and should not be used.

    che significa?
    Il compilatore ti avvisa che la gets è una funzione deprecated, in quanto è
    vulnerabile al 'buffer overflow'.
    Come alternativa è meglio utilizzare la fgets().
    prototipo : char *fgets(char *s, int n, FILE *stream);
    Es :
    codice:
    char buf[202]
    fgets( buf, 200, stdin);
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Ops avevo sbagliato!
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    91
    ok, la fgets e perfetta, grazie...
    l'unica cosa pero e che comunque devo mettere la grandezza, es:

    fgets(buf, 200, stdin) e se viene inserito un testo maggiore di 200?
    sono obbligato a mettere a priori la grandezza o posso fare in altro modo???

    grazie!!!!

  9. #9
    Originariamente inviato da dados881
    ok, la fgets e perfetta, grazie...
    l'unica cosa pero e che comunque devo mettere la grandezza, es:

    fgets(buf, 200, stdin) e se viene inserito un testo maggiore di 200?
    [...]
    I caratteri in più restano nel 'buffer di input', quindi farai bene anche a mettere dopo ogni
    fgets() anche una 'fflush(stdin)' che rimuova questi eventuali caratteri 'in avanzo'.
    Un' altra cosa, avrai notato che la fgets() lascia alla fine della stringa, prima del terminatore '\0',
    un valore 13 (il tasto invio) per rimuoverlo (se vuoi) puoi fare così :
    codice:
    buf[strlen(buf)-1]='\0';
    [...]
    sono obbligato a mettere a priori la grandezza o posso fare in altro modo???

    grazie!!!!
    Si a meno che tu non decida di abbandonare la dichiarazione 'statica' delle stringhe e
    passare a quella 'dinamica' (con la malloc() insomma ).
    Se invece scegliessi di riscrivere il codice in c++ puoi semplicemente utilizzare la classe string
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da Samuele_70
    Se invece scegliessi di riscrivere il codice in c++ puoi semplicemente utilizzare la classe string
    che sa ridimensionarsi da sola.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

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 © 2024 vBulletin Solutions, Inc. All rights reserved.