2016-06-23 34 views
7

ho un codice molto semplice per la conversione maiuscolo a minuscolo:stampe printf aggiuntivi * carattere

#include <stdio.h> 
int main() 
{ 
char c; 
int i=0; 
for (i=0;i<10;i++){ 
    c=getchar(); 
    c=c-'A'+'a'; 
    printf("%c\n",c); 
    } 
return 0; 
} 

Ma l'esecuzione di questo semplice codice sempre ho un carattere aggiuntivo * in uscita. Stampa il carattere seguito da un *. Date un'occhiata:

D 
d 
* 
D 
d 
* 
E 
e 
* 

Da dove viene?

+0

Eseguire un debuger, controllare il valore di 'C' in ogni iterazione ..... –

+2

Cordiali saluti, [' getchar() '] (http: // it .cppreference.com/w/c/io/getchar) restituisce 'int' e dovrebbe essere usato di conseguenza. – WhozCraig

+2

Qual è stato il tuo contributo a questo? – sidgupta234

risposta

12

Dopo ogni ingresso, a causa ENTER premuto chiave, c'è un newline che è memorizzato nel buffer di ingresso e letto nella successiva iterazione getchar().

un newline (\n) presenta valore ASCII 10 (decimale), aggiunto alla 'a'-'A' che è 32 (decimale), produce 42 (decimale), che stampa il *.

FWIW, getchar() restituisce un int. È una pessima idea archiviare il valore restituito di getchar() in una variabile char, poiché, nel caso, getchar() non riesce, uno dei possibili valori di ritorno, ad esempio EOF non verrà inserito in un tipo char, causando problemi in un ulteriore controllo condizionale anche di un tentativo fallito. Cambiare

char c; 

a

int c = 0; 
+0

Quindi, come sbarazzarsi di questo problema? –

+1

@SuperCoolHandsomeGelBoy Consuma il ''\' n' con un fittizio' getchar' ... o cambiando il codice usando 'scanf'? molti modi – LPs

+0

Queste cose hanno avuto risposta 1000 volte prima. Per domande sul misterioso fenomeno di input causato dal trascinamento di nuovi caratteri di riga nello stdin, fare riferimento al wiki [Come leggere/analizzare l'input in C? Le FAQ] (http://stackoverflow.com/questions/35178520/how-to-read-parse-input-in-c-the-faq) (sentiti libero di migliorare se manca qualcosa). Per le domande relative agli errori relativi a EOF come int, ci sono anche innumerevoli duplicati. – Lundin