2015-05-15 4 views
0
#include<stdio.h> 
#include<conio.h> 

void main() 
{ 
    char c; 
    int i; 
    clrscr(); 
    scanf("%c",&c); 
    scanf("%c",&c); 
    printf("%c",c); 
    getch(); 
} 

Эта программа не принимает значение char c во второй раз, однако отлично работает в случае целочисленной переменной. Почему так?Невозможно изменить значение переменной char

+2

Да, это так. Вы просто не замечаете *, которое имеет значение char. :) – CiaPan

+0

Дескриптор поля '% c' отличается от' scanf() ', чем большинство других, поскольку он не пропускает начальные пробелы. Это точно так, что он может сканировать * любой символ *, включая пробельные символы. Из всех стандартных спецификаторов 'scanf()' для преобразования есть только 'c',' ['и' n' (и 'n' - частный случай). –

ответ

1

Добавить в дополнительном пространстве перед %c:

scanf(" %c",&c); 

Это происходит потому, что в предыдущем scanf, вы ввели символ, а затем перевод строки \n. Таким образом, в первом scanf символ был сохранен, а во втором scanf была сохранена новая строка.

В качестве альтернативы вы можете использовать getchar для хранения новой строки. Добавить getchar() до второго scanf и после первого scanf.

+0

понял вашу точку, но то же самое не происходит в случае целочисленной переменной..почему это происходит только в случае символа? –

+1

@AnkitBatra: потому что '% d' автоматически пропускает пробелы и символы новой строки, тогда как'% c' не может: он принимает их как действительные символы. (В вашей программе '\ n' печатается). –

1

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

Вы можете сообщить scanf, чтобы отбросить ведущие пробелы, добавив перед форматом пробел: " %c".

+0

понял вашу точку, но то же самое не происходит в случае целочисленной переменной..почему это происходит только в случае символа? –

+0

@AnkitBatra Поскольку в любом другом формате он встроен, чтобы пропускать ведущие пробелы. См. [эта ссылка 'scanf' (и family)] (http://en.cppreference.com/w/c/io/fscanf). –

+0

также, если я использую fflush между 2 зсапЕ, то почему она не работает, как символ новой строки должен быть накинута на fflush: - #include #include недействительным основной() { символ с; int i; clrscr(); зсапЕ ("% с", &c); fflush (стандартный вывод); зсапЕ ("% с", &c); Е ("% с", с); Геч();} –

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