2015-12-30 9 views
1

Ниже приводится программой, которая принимает два символа и выводит ихзсапа() с различным спецификатором формата

#include<stdio.h> 
int main() 
{ 
    char c1, c2; 
    printf("\n Enter characters one : "); 
    scanf(" %c", &c1); 
    printf("\n Enter character two : "); 
    scanf("%c", &c2); 
    printf("\n The the characters are %c and %c ", c1, c2); 
    return 0; 
} 

Теперь один экземпляр выхода: -

Enter two characters : a 
The the characters are a and 

Проблема заключается в том, что пристанище I» t задано любое пространство между двумя спецификаторами форматирования %c Здесь я нажал 'a', а затем '\ n', который хранится в c1 и c2 соответственно. И таким образом я получил выход, который не был принят.

Я знаю, как исправить эту проблему.

Теперь я делаю ту же программу для целых чисел: -

#include<stdio.h> 
int main() 
{ 
    int a, b; 
    printf("\n Enter two numbers : "); 
    scanf("%d%d", &a, &b); 
    printf("\n The two numbers are %d and %d ", a, b); 
    return 0; 
} 

Здесь мы не обнаружили никаких проблем.

Я думаю, что на этот раз мы не столкнулись с проблемой, потому что второй ввод, который мы даем, это '\n' или пространство, которое не является целым числом, и поэтому мы получаем отказ при чтении из функции scanf(), поэтому входной буфер по-прежнему активен и если мы нажмем следующий ввод как целое, то он будет сохранен в переменной 'b'.

Можете ли вы рассказать мне причину, по которой я считал правильным, или нет?

Теперь, если это правильно, что произойдет, если я снова нажму символ. Затем он также не должен храниться в переменной 'b', но на этот раз 0 сохраняется в переменной 'b'.

Так что мой вопрос заключается в том, что то, что является причиной для правильного поведения программы, когда я пытаюсь сделать ту же программу с %d

+4

'зсапЕ ("% с", &c2);' -> 'зсапЕ ("% с", &c2);' с пространством так же, как в первом использовании Параметр '% формат d' пропускает пробелы, символ'% гр. 'format does not.' space' делает это так. –

+0

Возможный дубликат [C: Несколько scanf, когда я ввожу значение для одного scanf, он пропускает второй scanf] (http://stackoverflow.com/questions/ 9562218/c-multiple-scanfs-when-i-enter-in-a-value-for-one-scanf-it-skips-the-second-s) –

+0

нет, это не так ... Я прошел через это и после что я задал этот вопрос –

ответ

2

Чтобы ответить на ваш вопрос, давайте посмотрим на C11 стандарт, глава §7.21.6.2

Ввод пробельные символы (как указанные функцией isspace) пропущены, за исключением случаев, когда спецификация включает спецификатор [,или n.

Так что, когда у вас есть newline ('\n', что действительно бело-символ пробела) слева во входном буфере,

  • в случае scanf("%c", &charVar);, символ новой строки рассматривается как вход , поэтому второе сканирование пропускает с запросом на ввод от пользователя.

  • в случае scanf("%d", &intVar); оставшейся newline является пропускается и ждать целых ввода появляться, так что останавливается и спрашивает пользователя для ввода.

Однако FWIW, в последнем случае, если вы вводите непробельные символа и нажмите ENTER, входные символа будет рассматриваться как вход, вызывая сбой согласования.

Связанные

[...] Если элемент ввода не совпадающая последовательность, исполнение директивы не может: это условием является отказ соответствия.

+0

откуда вы видите «стандарт C11, глава §7.21.6.2»? –

+0

@rajaTHEKING Извините, что я вас не понял. Что значит «от чего»? Он находится в стандартном документе. У меня N1570. Кого вы имеете в виду? Основываясь на пересмотре, нумерация глав может немного отличаться. –

+0

@raja THE KING 2 I googled «Введите символы пробела (как указано« и придумал много хитов, включая [this] (http://www.gnu.org/software/libc/manual/html_node/String- Input-Conversions.html) – chux

0

Он читает новую строку, как символ новой строки является символом. Простое изменение scanf("%c", &c2); до scanf(" %c", &c2); заставит его работать.

Так что в вашем коде: #include

int main() 
{ 
    char c1, c2; 
    printf("\n Enter characters one : "); 
    scanf(" %c", &c1); 
    printf("\n Enter character two : "); 
    scanf(" %c", &c2); 
    printf("\n The the characters are %c and %c ", c1, c2); 
    return 0; 
} 
+0

Я уже знаю, как это сделать, но я хочу знать, какая разница создается, когда я использую спецификатор формата% d. И особенно причина этого. –

+2

@rajaTHEKING Новая строка canno t анализируется как int, что делает различие в этом случае. – Dom

+0

В порядке, я думаю, что новая строка не может быть проанализирована в int, потому что ее символ ('\ n') .. правильно? –