2010-02-10 4 views
0

интересно все о C, вы можете прояснить этотаномальное поведение Scanf

Я использую Turbo C

У меня есть этот код

scanf(“%d , %d”,&a,&b); 
printf(“%d,%d”,a,b); 
scanf(”%c”,&c); 
printf(“%d,%d”,a,b); 

затем зсапЕ для оленья кожа значения сканирования с

мощность: 1,2

если я использую это

scanf(“%d , %d”,&a,&b); 
printf(“%d,%d”,a,b); 
scanf(”%c ”,&c);//note a blank after %c 
printf(“%d,%d”,a,b); 

затем он сканирует значение c.

выход 1,2 1,2

же код

scanf(“%d , %d”,&a,&b); 
printf(“%d,%d”,a,b); 
scanf(”%1s”,&c); 
printf(“%d,%d”,a,b); 

в этом значении сегмента будет отображаться, но значение Ь будет установлено 0

выход 1, 2 1,0

Вы можете объяснить ответы обоих вопросов.

получил техника его подводит ответы еще помочь мне .......

+0

Пожалуйста, покажите вход, на котором вы работаете –

+0

типы также имеют важное значение здесь. –

+0

говорят, что мы предоставляем a = 2, b = 3 –

ответ

1

Как вы знаете, что ни один символ не сканируется на c в первом случае? Я предполагаю, что это связано с тем, что вы предоставляете неисключенный оператор печати и ничего не видите.

Прочитайте страницу человека осторожную о поведении% C спецификатора:

гр
Соответствует последовательность символов ширины количества (по умолчанию 1); следующий указатель должен быть указателем на символ, и должно быть достаточно места для всех символов (не добавляется завершающий NUL). Обычный пропущен ведущий пробел. Чтобы пропустить пробел , сначала используйте явное пространство в формате.

[курсив]

Если вход имеет форму, как 1, 2 a первое сканирование съедает 1 , 2 и оставляет a, и в этот момент второй проверки ест пространство. Не уверен, как второй пример будет работать в этом случае.

Anon. is on the money about the third case.

3

В своем последнем случае, это сделать с тем, где значения устанавливаются в памяти.

Второй scanf помещает строку длины 1 по адресу c - то есть один символ, за которым следует нулевой ограничитель.

Угадайте, куда идет нулевой ограничитель?

+0

Он летает из вашего носа, конечно! –