аномальное поведение сканф - PullRequest
0 голосов
/ 10 февраля 2010

интересно все о C, можете ли вы демистифицировать это

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

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

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

, затем scanf для определения значения c

вывод: 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);

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

Выход 1,2 1,0

Можете ли вы объяснить ответы на оба вопроса.

не получил ответы, но помогите мне .......

Ответы [ 2 ]

3 голосов
/ 10 февраля 2010

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

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

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

1 голос
/ 10 февраля 2010

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

Внимательно прочитайте справочную страницу о поведении спецификатора% c:

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

[выделение добавлено]

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

Anon. на деньги о третьем случае.

...