2015-12-24 17 views
5

Ho un problema che, dopo molti test, penso che sia dovuto a me non capire come funziona il buffer di input.C - ciclo di do/while basato sull'utente che non funziona correttamente

Ho un ciclo while che dovrebbe continuare a iterare finché l'utente non digita "no" per interrompere l'iterazione.

Ho due problemi.

  1. La mentre non smette mai di scorrere indipendentemente l'utente inserisce "no" o ciò che non è uguale a "sì"
  2. Come si può vedere l'uscita al secondo ciclo ha un problema. Il programma non chiede all'utente di inserire una stringa e saltare questo passaggio, come l'utente digita semplicemente INVIO.

CODICE:

int foo = 0; 

do{ 

    int i, cycles; 
    char array[MAX_LENGTH+1]; 



    for(cycles=0; cycles < MAX_READ_CYCLES; cycles++){ 

    i=0; 

    printf("\n\nEnter a string: "); 

    char ch; 
    while ((ch = getchar()) != '\n' && ch != EOF) { 
     array[i] = ch; 
     i++; 
    } 

    array[i] = '\0'; //string terminator 


    printf("String you entered: %s\n", array); 

    printf("\nDo you want to continue? 1: yes/0: no \n"); 
    scanf("%d", &foo); 

    } 

} while(foo == 1); 

OUTPUT

Enter a string: test 
String you entered: test 

Do you want to continue? 1: yes/0: no 
0 

Enter a string: String you entered: 

Do you want to continue? 1: yes/0: no 
3 

Enter a string: String you entered: 

Do you want to continue? 
+1

Prova questo: 'fflush (stdin)' dopo l'output della stringa inserita. – Mxsky

+0

Sfortunatamente non funziona ancora correttamente anche se inserisco un 'fflush (stdin)'. Inoltre mi è stato detto di evitare l'uso di fflush (stdin) perché ha un comportamento indefinito. – fbid

+0

Ecco la tua risposta: http://stackoverflow.com/questions/16908008/scanf-getchar-working-correctly-only-first-time-through-loop – Mxsky

risposta

5

Il programma non termina se l'utente inserisce "yes" causa della interno for ciclo:

#include <stdio.h> 
#include <string.h> 
#define MAX_LENGTH 100 
#define MAX_READ_CYCLES 100 

int main() { 
    int cycles = 0; 
    char foo[4]; 
    do { 
     char array[MAX_LENGTH + 1]; 

     printf("\n\nEnter a string: "); 

     char ch; 
     int i = 0; 
     while ((ch = getchar()) != '\n' && ch != EOF) { 
      array[i] = ch; 
      i++; 
     } 

     array[i] = '\0'; //string terminator 


     printf("String you entered: %s\n", array); 

     printf("\nDo you want to continue?"); 
     scanf("%s", foo); 

     cycles++; 

     while ((ch = getchar()) != '\n' && ch != EOF); // force drop stdin 

    } while (strcmp(foo, "yes") == 0 && cycles < MAX_READ_CYCLES); 
} 

vedi anche I am not able to flush stdin e http://c-faq.com/stdio/stdinflush2.html

+1

Hai ragione, il problema 1. era dovuto al mio ciclo for. Grazie – fbid

+0

@fbid vedi la mia modifica per il tuo altro problema – orestisf

+0

Cattivo, cattivo, cattivo! L'uso di 'foo' può causare un overflow del buffer in' scanf' e, potenzialmente, un sovraccarico del buffer in 'strcmp'. –

0

Si crea un array di caratteri di 3 byte e quindi memorizzare più di tre byte in esso. Non dimenticare che ci sarà un viraggio nullo alla fine di quello. Dato che non stai allocando abbastanza spazio, sovrascrivi altre posizioni di memoria che creeranno sempre un comportamento indefinito.

Nota, anche, che scanf qui è molto pericoloso. E 'anche non valido per inizializzare un array di caratteri come questo: char foo[3]="";

+0

Hai ragione riguardo all'array 'foo [3]', è stato solo un rapido esempio per riprodurre un semplice caso di test. Comunque, anche se uso una variabile intera, 'int foo = 0 'e poi sostituisco la condizione while a' while (foo == 1)' il problema persiste. – fbid