Linguaggio C: chiedo chiarimento
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 12 di 12

Discussione: Linguaggio C: chiedo chiarimento

Cambio titolo
  1. #1
    Bannato
    Registrato il
    02-07
    Messaggi
    8.235

    Linguaggio C: chiedo chiarimento

    Allora vorrei capire alcune cose:
    Se voglio acquisire una sequenza, per ex, di 10 caratteri, come faccio?
    Per acquisire una stringa uso la funzione gets() oppure scanf("%s", stringa), previo averla dichiarata(char stringa[10]), ma per i caratteri come funziona?

    N.B Sono al corrente che sia gets() che quello scanf, anche se dichiaro una lunghezza di 10 caratteri non si fermano, ma continuano ad aquisire, ma cio' per ora non interessa gestirlo.

  2. #2
    Utente L'avatar di iLeo
    Registrato il
    03-11
    Località
    Londra
    Messaggi
    3.177
    Citazione andry90+ Visualizza Messaggio
    Allora vorrei capire alcune cose:
    Se voglio acquisire una sequenza, per ex, di 10 caratteri, come faccio?
    Per acquisire una stringa uso la funzione gets() oppure scanf("%s", stringa), previo averla dichiarata(char stringa[10]), ma per i caratteri come funziona?

    N.B Sono al corrente che sia gets() che quello scanf, anche se dichiaro una lunghezza di 10 caratteri non si fermano, ma continuano ad aquisire, ma cio' per ora non interessa gestirlo.
    A parte che ti conveniva postare nella sezione di programmazione e non in otv, cosa intendi per caratteri? una stringa può anche essere formata da un solo carattere quindi puoi semplicemente interpretare un carattere come una stringa di lunghezza 1.

  3. #3
    Utente L'avatar di oo0d3v1l0oo
    Registrato il
    08-07
    Località
    Into The Nature
    Messaggi
    643
    c'è la sezione apposta in computer...



  4. #4
    da 3? L'avatar di Celebron
    Registrato il
    07-06
    Località
    Sotto Canestro
    Messaggi
    14.462
    Citazione andry90+ Visualizza Messaggio
    Allora vorrei capire alcune cose:
    Se voglio acquisire una sequenza, per ex, di 10 caratteri, come faccio?
    Per acquisire una stringa uso la funzione gets() oppure scanf("%s", stringa), previo averla dichiarata(char stringa[10]), ma per i caratteri come funziona?

    N.B Sono al corrente che sia gets() che quello scanf, anche se dichiaro una lunghezza di 10 caratteri non si fermano, ma continuano ad aquisire, ma cio' per ora non interessa gestirlo.
    usi una cosa tipo

    i=0
    while(((carat = getchar()) != '\n') && i<limite ){
    //elaborazione
    i++;
    }
    getchar(); //mangia l'ultimo \n

  5. #5
    Bannato
    Registrato il
    02-07
    Messaggi
    8.235
    Citazione iLeo Visualizza Messaggio
    A parte che ti conveniva postare nella sezione di programmazione e non in otv, cosa intendi per caratteri? una stringa può anche essere formata da un solo carattere quindi puoi semplicemente interpretare un carattere come una stringa di lunghezza 1.
    Una sequenza di caratteri del tipo: A T A T A T D T, aquisiti uno alla volta da tastiera.

    Citazione oo0d3v1l0oo Visualizza Messaggio
    c'è la sezione apposta in computer...
    Si lo so, ma non e' molto attiva.

  6. #6
    Titolo utente L'avatar di TheRimble
    Registrato il
    01-08
    Località
    L'ombelico del mondo
    Messaggi
    16.674
    Ho spostato in Programmazione.

  7. #7
    Bannato
    Registrato il
    01-11
    Messaggi
    177
    Citazione Celebron Visualizza Messaggio
    usi una cosa tipo

    i=0
    while(((carat = getchar()) != '\n') && i<limite ){
    //elaborazione
    i++;
    }
    getchar(); //mangia l'ultimo \n
    in modo più semplice, può dichiarare un vettore arbitrariamente grande e immagazzinare nel posto i (inizializzato a 0) tutti i caratteri (dati da una sola variabile n che muta a ogni iterazione) finché non si raggiunge il posto 9, con la condizione di controllo all'inizio del while e s[i++] = n

  8. #8
    da 3? L'avatar di Celebron
    Registrato il
    07-06
    Località
    Sotto Canestro
    Messaggi
    14.462
    Citazione mortolivo Visualizza Messaggio
    in modo più semplice, può dichiarare un vettore arbitrariamente grande e immagazzinare nel posto i (inizializzato a 0) tutti i caratteri (dati da una sola variabile n che muta a ogni iterazione) finché non si raggiunge il posto 9, con la condizione di controllo all'inizio del while e s[i++] = n
    deve comunque controllare l'arrivo di \n non sapendo quanto sarà lunga la stringa immessa e soprattutto non volendo salvare il \n all'interno dell'array

  9. #9
    Bannato
    Registrato il
    02-07
    Messaggi
    8.235
    Allora ho provato in questo modo, e non capisco perche con gli interi funziona, invece con i char esce dal ciclo al terzo carattere!! OMG

    Codice:
    int main()
    int i;
    char c,s1[5];           
        
    for(i=0;i<5;i++)
    {
    scanf("%c",&c);
    
    s1[i]=c;
    }

  10. #10
    Utente L'avatar di iLeo
    Registrato il
    03-11
    Località
    Londra
    Messaggi
    3.177
    mmm hai provato a usare il getch() invece della scanf()??

  11. #11
    Let's third-barrel durrrr L'avatar di Ibrahimovic 89
    Registrato il
    07-05
    Località
    Turin
    Messaggi
    6.570
    Citazione andry90+ Visualizza Messaggio
    Allora ho provato in questo modo, e non capisco perche con gli interi funziona, invece con i char esce dal ciclo al terzo carattere!! OMG

    Codice:
    int main()
    int i;
    char c,s1[5];           
        
    for(i=0;i<5;i++)
    {
    scanf("%c",&c);
    
    s1[i]=c;
    }
    E' normale, quando vuoi inserire dei caratteri, poniamo ad esempio la sequenza "casa", i tasti che premerai con questo algoritmo sono:
    -c
    -invio
    -a
    -invio
    -s
    -invio
    -a
    -invio

    Dato che il vettore di caratteri è lungo 5, quello che conterra' al termine dell'algoritmo sara':
    Codice:
    s1 = { 'c', '\n', 'a', '\n', 's' }
    Il problema è che tutto quello che digiti sulla tastiera viene bufferizzato, e la scanf legge da questo buffer scartando i caratteri uno alla volta in questo caso, quindi premendo sulla tastiera c,invio,a,invio, ecc ecc e usando lo specificatore di formato '%c' all'interno della scanf essa consumera' il buffer un carattere alla volta, e l'invio è un vero e proprio carattere nell'ANSI.

    Per risolvere il problema, aggiungi una getchar() subito dopo s1[i]=c in modo da consumare il \n dato dall'invio, altrimenti questo \n rimarra' nel buffer e alla iterazione seguente verra' letto dalla scanf.

    Con gli interi questo problema non si verifica perche' lo specificatore %d dello scanf opera in questa maniera:
    -guardo il buffer di tastiera
    -il primo elemento è un numero?
    ----SI: lo prendo e lo elimino dal buffer
    ----NO: lo elimino dal buffer e analizzo il successivo

    Quindi se volessimo inserire i numeri dall'1 al 5 premeremmo 1,invio,2,invio,3,invio,4,invio,5,invio e a ogni iterazione dove il buffer inizia con l'invio (che è un carattere e non un numero) la scanf scarta quel \n e legge l'elemento successivo.

    Spero di essere stato chiaro

  12. #12
    Bannato
    Registrato il
    02-07
    Messaggi
    8.235
    Grazie mille Ibra; ora funziona, mai ci sarei arrivato.
    Grazie mille!
    <3

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •