2012-12-11 11 views
6

Sono inclinato alla programmazione C. Ho scritto un ciclo dispari ma non funziona mentre utilizzo %c in scanf().
ecco il codice:Il ciclo dispari non funziona utilizzando% c

#include<stdio.h> 
void main() 
{ 
    char another='y'; 
    int num; 
    while (another =='y') 
    { 
     printf("Enter a number:\t"); 
     scanf("%d", &num); 
     printf("Sqare of %d is : %d", num, num * num); 
     printf("\nWant to enter another number? y/n"); 
     scanf("%c", &another); 
    } 
} 

Ma se io uso %s in questo codice, per esempio scanf("%s", &another);, allora funziona bene.
Perché succede? Qualche idea?

+0

Quando si digita il 'num' e si preme INVIO, quindi il codice ASCII di ENTER viene memorizzato nel buffer scanf e ogni volta che si legge il prossimo carattere singolo, non si attenderà l'input dell'utente e il codice ASCII' ENTER' verrà memorizzato nella variabile 'another'. –

risposta

1

utilizzare getch() invece di scanf() in questo caso. Perché scanf() si aspetta '\ n', ma stai accettando solo un carattere in quel scanf(). quindi '\ n' dato al successivo scanf() causa confusione.

10

La conversione %c legge il successivo carattere singolo dall'input, indipendentemente da cosa sia. In questo caso, hai precedentemente letto un numero utilizzando %d. Dovevi premere il tasto Invio per il numero da leggere, ma non hai fatto nulla per leggere la nuova riga dal flusso di input. Pertanto, quando esegui la conversione %c, legge quella nuova riga dal flusso di input (senza attendere che tu inserisca effettivamente qualcosa, poiché c'è già un input in attesa di essere letto).

Quando si utilizza %s, salta attraverso qualsiasi spazio bianco iniziale per ottenere un carattere diverso dallo spazio bianco. Tratta una nuova riga come spazio bianco, quindi salta implicitamente attraverso quella nuova linea in attesa. Poiché non c'è (presumibilmente) nient'altro in attesa di essere letto, si attende di aspettare che tu entri in qualcosa, come apparentemente desideri.

Se si desidera utilizzare %c per la conversione, è possibile precederlo con uno spazio nella stringa di formato, che salterà anche su qualsiasi spazio bianco nel flusso.

+0

grazie per le informazioni –

+0

@JessicaLingmn: Sicuramente. –

0
#include<stdio.h> 
void main() 
{ 
char another='y'; 
int num; 
while (another =='y') 
{ 
    printf("Enter a number:\t"); 
    scanf("%d", &num); 
    printf("Sqare of %d is : %d", num, num * num); 
    printf("\nWant to enter another number? y/n"); 
    getchar(); 
    scanf("%c", &another); 
} 
} 
2

Il tasto INVIO giace nello stream stdin, dopo aver immesso un numero per la prima scanf% d. Questa chiave viene catturata dalla linea scanf% c.

utilizzare scanf("%1s",char_array); another=char_array[0];.

+1

-1 per la raccomandazione [comportamento non definito] (http://c-faq.com/stdio/stdinflush.html). – Lundin

+0

Il mio male ... modifica la risposta. – anishsane

Problemi correlati