2016-06-23 4 views
7

У меня есть очень простой код для преобразования Верхнего регистра в нижнем регистре:PRINTF печатает дополнительный символ *

#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; 
} 

Но работает этот простой код всегда у меня есть дополнительный * характер на выходе. Он печатает символ, следующий за *. Посмотрите:

D 
d 
* 
D 
d 
* 
E 
e 
* 

Откуда это?

+0

Выполнить Debuger, проверьте значение 'c' в каждой итерации ..... –

+2

Fyi, [' GetChar() '] (HTTP: // EN .cppreference.com/w/c/io/getchar) возвращает 'int', и его следует использовать соответствующим образом. – WhozCraig

+2

Что вы были в курсе событий? – sidgupta234

ответ

12

После каждого входа, из-за ENTER нажатой клавиши, есть newline, который хранится во входном буфере и читать в следующей итерации getchar().

newline (\n) имеет значение ASCII из 10 (десятичных), добавленных к 'a'-'A', который является 32 (десятичным), производит 42 (десятичные), который печатает *.

Факс: int. Очень неплохо сохранить возвращаемое значение getchar() в переменной char, так как в случае, если getchar() не работает, одно из возможных значений возврата, например EOF, не будет вписываться в тип , что вызовет проблемы с дополнительной условной проверкой даже попытки отладки. Изменение

char c; 

к

int c = 0; 
+0

Итак, как избавиться от этой проблемы? –

+1

@SuperCoolHandsomeGelBoy Использовать '' \ 'n' с фиктивным 'getchar' ... или изменить код с помощью' scanf'? много способов – LPs

+0

За эти вопросы ответили 1000 раз. Для вопросов о таинственном явлении ввода, вызванном возвратом новых символов строки в stdin, см. Wiki [Как читать/анализировать входные данные в C? FAQ] (http://stackoverflow.com/questions/35178520/how-to-read-parse-input-in-c-the-faq) (не стесняйтесь улучшаться, если что-то отсутствует). Для вопросов, связанных с ошибками, связанными с EOF, являющимися int, существует бесчисленное количество дубликатов. – Lundin

Смежные вопросы