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

    [C] Controllo valori letti dalla gets

    Salve a tutti,
    praticamente devo acquisire una frase, quaclosa comprendete caratteri e spazi, insomma fermandosi al carattere di "invio". Diciamo una stringa di 30 caratteri.

    Ho implementato il tutto con una gets perchè mi è sembrato il modo migliore, e con meno "problematiche" per leggere una stringa comprendente spazi. Ora mi sono accorto che se la scritta supera i 30 caratteri il programma va in timeout.

    Come potrei inserie un controllo che, in caso di stringa troppo lunga, lo notifichi?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C] Controllo valori letti dalla gets

    In timeout ?

    Ma cosa dici ?

    Usa la fgets al posto della gets ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

    Re: Re: [C] Controllo valori letti dalla gets

    Originariamente inviato da oregon
    In timeout ?

    Ma cosa dici ?

    Usa la fgets al posto della gets ...
    Cioè si blocca, va in loop.... come lo vuoi chiamare?

    Che differenze ha la fgets?

    Io avevo grossomodo risolto con un strlen. Ora però mi trovo a dover controllare "il numero di cifre di un intero". Con la fgets c'è modo di sapere se sono più di 10 cifrE? (perchè poi in un'altra funzione dovrà essere convertito in caratteri ed anche qui se è piu lungo di una certa grandezza mi darà problemi).
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  4. #4

    Re: Re: Re: [C] Controllo valori letti dalla gets

    Originariamente inviato da Neptune
    Cioè si blocca, va in loop.... come lo vuoi chiamare?
    "va in timeout" = il programma attende qualcosa per un po', se non lo riceve entro un certo tempo va in timeout
    "va in loop" = continua a ripetere lo stesso blocco di codice all'infinito
    Sono due cose che non c'entrano nulla.

    Nello specifico probabilmente il problema non ha a che vedere con nessuno dei due casi, ma piuttosto riguarda il fatto che scrivendo più caratteri del dovuto si vanno a sovrascrivere porzioni di stack innocenti, per cui il programma inizia a fare cose strane (ad esempio se si sovrascrive l'indirizzo di ritorno il programma salterà ad una locazione di memoria che non c'entra nulla).

    Tra l'altro un compilatore/linker recente ti segnalerà di sicuro che la gets è ultra-deprecata.
    Che differenze ha la fgets?
    La documentazione, questa sconosciuta...

    Io avevo grossomodo risolto con un strlen.
    Non risolvi niente così, visto che quando la gets ritorna se sono stati inseriti troppi caratteri il danno ormai è fatto (è stato corrotto lo stack).
    Ora però mi trovo a dover controllare "il numero di cifre di un intero". Con la fgets c'è modo di sapere se sono più di 10 cifrE? (perchè poi in un'altra funzione dovrà essere convertito in caratteri ed anche qui se è piu lungo di una certa grandezza mi darà problemi).
    Spiegati meglio: vuoi sapere quante cifre avrà un int una volta convertito in stringa?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5

    Re: Re: Re: Re: [C] Controllo valori letti dalla gets

    Originariamente inviato da MItaly
    "va in timeout" = il programma attende qualcosa per un po', se non lo riceve entro un certo tempo va in timeout
    "va in loop" = continua a ripetere lo stesso blocco di codice all'infinito
    Sono due cose che non c'entrano nulla.

    Nello specifico probabilmente il problema non ha a che vedere con nessuno dei due casi, ma piuttosto riguarda il fatto che scrivendo più caratteri del dovuto si vanno a sovrascrivere porzioni di stack innocenti, per cui il programma inizia a fare cose strane (ad esempio se si sovrascrive l'indirizzo di ritorno il programma salterà ad una locazione di memoria che non c'entra nulla).

    Tra l'altro un compilatore/linker recente ti segnalerà di sicuro che la gets è ultra-deprecata.

    La documentazione, questa sconosciuta...


    Non risolvi niente così, visto che quando la gets ritorna se sono stati inseriti troppi caratteri il danno ormai è fatto (è stato corrotto lo stack).

    Spiegati meglio: vuoi sapere quante cifre avrà un int una volta convertito in stringa?
    Si, grossomodo, devo quindi convertirlo a priori e fare una strlen, o c'è qualche funzione che me lo dice gia in lettura?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  6. #6
    Devi calcolarti qual è la dimensione massima della rappresentazione decimale di un int a priori; tieni presente che non puoi mai fare quel tipo di giochi con la strlen, visto che se usi buffer statici questi devono essere dimensionati prima del loro uso; se sfori le dimensioni di un buffer sei già nei guai, non ci puoi mettere toppe a posteriori con la strlen.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da MItaly
    Devi calcolarti qual è la dimensione massima della rappresentazione decimale di un int a priori; tieni presente che non puoi mai fare quel tipo di giochi con la strlen, visto che se usi buffer statici questi devono essere dimensionati prima del loro uso; se sfori le dimensioni di un buffer sei già nei guai, non ci puoi mettere toppe a posteriori con la strlen.
    Ma se devo leggere un intero, come faccio ad evitare quindi che un utente mi inserisca mille volte 1 e quindi sfori?

    La mia lettura dell'intero è attualmente questa:

    codice:
           do{
                fflush(stdin);
                printf("\nInserire l'ID: ");
                errore_lettura = scanf("%d",&TEMP_DATA.identifier);
                if(errore_lettura)
                {
                    //debug
                   //printf("E' INTERO!!!!\n\n");    
                   //debug                                 
                }
                else
                {
                   printf("Errore: L'id deve essere un numero intero > 0"); 
                   fflush(stdin);
                }
                
                
             }
             while((TEMP_DATA.identifier < 0) || (errore_lettura == 0));
    L'unica cosa che controllo è il ritorno della scanf, che mi dice se è stato realmente inserito un intero o meno. Però mi accorgo che se metto come input un sacco di 1 non mi da nessun messaggio sdi errore e mi ripete la "lettura come nulla fosse", gli rido molti 1 in input e mi ripete la lettura, ci riprovo e mi legge "un valore a casaccio".


    E' un problema che mi fa un pò "random" o meglio, non riesco a determinare il perchè.

    Per tagliare la testa al toro come posso proprio evitare l'inserimento di troppe cifre? una scanf non fa nessun genere di controllo?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  8. #8
    La scanf in ogni caso non può metterti in un intero un valore superiore al massimo valore contenibile nell'intero in questione. In ogni caso puoi vedere dal valore restituito dalla scanf se ci sono stati errori: essa infatti restituisce il numero di campi correttamente acquisiti, per cui se è diverso dal numero di campi specificati nella stringa di formato c'è sicuramente un errore. Non so tuttavia se la scanf si dia pena di riportare come errore un numero di caratteri nel buffer maggiore di quelli che ha effettivamente convertito.

    Comunque hai presentato il problema in maniera errata: da quello che dicevi sembrava che tu dovessi convertire un int in una stringa, mentre è l'esatto contrario.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.