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

    [C] Do..while che non funziona

    Ho la seguente funzione:

    codice:
    struct StringPool acquisizione()
    {
           struct StringPool TEMP_DATA;
           int errore_lettura; //flag di controllo per la lettura dell'id
           int leggi;
           do{
                printf("\nInserire l'ID");                     //ciclo per l'inserimento dell'ID.Ciclerà
                errore_lettura = scanf("%d",&TEMP_DATA.identifier);
                if(errore_lettura)
                {
                   printf("E' INTERO!!!!\n\n");                                     
                }
                else
                {
                   printf("Errore: L'id deve essere un numero intero > 0"); 
                }
                
                            //fino a quando non verrà immesso un numero positivo
             }
             while((TEMP_DATA.identifier < 0) || (errore_lettura == 0));
           
           do{          
                printf("\nInserire la stringa");               //ciclo per l'inserimento della stringa.Ciclerà
                scanf("%s",TEMP_DATA.str);                     //fino a quando non verrà immessa una stringa 
             }while(*TEMP_DATA.str=='\0');                     //diversa dalla stringa vuota
             
          return(TEMP_DATA);   
    }
    Nella scanf di "TEMP_DATA.identifier" mi preme sapere se è un intero, o se è stato inserito una cifra e quindi valorizzo il errore_lettura con il valore di ritorno della scanf.

    Il punto è che per come stanno le cose, se metto un numero tutto bene, se metto delle lettere mi va in loop il ciclo stampandomi all'infinito "Inserire l'IDErrore: L'id deve essere un numero intero > 0".

    Dove sto sbagliando? sarà l'orario

    Vi ringrazio in anticipo per l'aiuto,
    Neptune.
    "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
    inserisci

    codice:
    fflush(stdin);
    subito dopo

    codice:
    printf("Errore: L'id deve essere un numero intero > 0");

  3. #3
    Gia che siamo in tema, per leggere subito dopo una stringa uso il seguente codice:

    codice:
    gets(TEMP_DATA.str); 
           /*Il ciclo andrà avanti finquando non sarà inserita una stringa
           non vuota*/                       
             while(*TEMP_DATA.str=='\0')
             {
                printf("\nInserire la stringa: ");  
                gets(TEMP_DATA.str);
             }
    Mi scoccia che mi tocca mettere prima del while una "gets" per svuotare il buffer. Se uso una semplice scanf con la modalità %s però posso leggere una singola parola, invece la gets mi permette di leggerne un intera frase.

    Come posso ovviare a questo problema? sembra davvero male quella doppia gets.
    "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
    Non ho ben capito. Se il tuo problema è che lo stdin rimane sporcato dalla scanf precedente a seguito, ad esempio, dell'inserimento di spazi, ti basta usare fflush e poi usare il do...while per la gets:

    Codice PHP:
    #include <stdio.h>
    #include <string.h>

    int main()
    {
        
    char string[32];

        
    printf("[scanf]>> ");
        
    scanf("%s", &string);
        
    fflush(stdin);
        
        
    printf("[echo]>> %s\n"string);
        
        do {
            
    printf("[gets]>> ");
            
    gets(string);
        } while( 
    strlen(string) == 0);
        
        
    printf("[echo]>> %s"string);

    Alla printf puoi dare come input anche una parola e tantissimi spazi, seguiti da altre parole ecc...
    fflush ripulisce lo stdin e la gets viene eseguita senza problemi

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.