Format %n
specifier, gdy jest stosowany w scanf()
Oczekuje się do przechowywania zliczania liczby znaków w ciągu formatu już przetworzony przez funkcję do argumentu typu int*
.Według definicji:Dlaczego specyfikator formatu% n działa normalnie dla wszystkich instrukcji scanf(), ale zapisuje jedno mniej w pierwszym?
The number of characters of the format string already processed is stored in the pointed location.
Ale w moim programie działa tak samo we wszystkich, oprócz pierwszych scanf()
. We wszystkich scanf()
s w moim programie, z wyłączeniem pierwszego, przechowuje liczbę całkowitą liczbę znaków wprowadzonych z konsoli, w tym nowe linie (Wprowadź klucze). Ale w pierwszym scanf()
, liczba to mniejsza niż całkowita liczba znaków i linii podstawowych wprowadzona z konsoli.
Proszę wyjaśnić tę anomalię, ponieważ to naprawdę frustrujące, że nie mogę wykryć tego prostego błędu.
#include <stdio.h>
int main()
{
int a,b,c,d,count;
printf("First Trial\n");
scanf("%d%d%d%d%n",&a,&b,&c,&d,&count); //OUTPUT ANOMALY HERE
printf("count=%d\n",count);
printf("Second Trial\n");
scanf("%d%n",&a,&count);
printf("count=%d\n",count);
printf("Third Trial\n");
scanf("%d%d%n",&a,&b,&count);
printf("count=%d\n",count);
printf("Fourth Trial\n");
scanf("%d%n%d",&a,&count,&b);
printf("count=%d",count);
}
Wyjście Próbka
First Trial
253
34
4
83
count=11
Second Trial
25
count=3
Third Trial
234
38
count=7
Fourth Trial
3534
35
count=5
Dlaczego w pierwszym badaniu otrzymujemy "11" zamiast „12? To moje wątpliwości.
CRUCIAL EDIT
Kolejne odkrycie.Jeśli dla pierwszego scanf()
, zamiast klawiszy Enter
(nowe linie), aby oddzielić wprowadzone liczby, jeśli użyję spacji, wiele białych znaków, wtedy wszystkie te białe spacje są również liczone przez count
. Na przykład otrzymuję count=21
. Oznacza to nowe linie, spacje, wszystko jest rozważany.Ale dlaczego jest jeden mniej dla pierwszego procesu?
First Trial
25 35 38 98
count=21
Jeśli pierwsze 'scanf()' nie zużywa nowych linii używanych do wysłania danych wejściowych, to jak wytłumaczysz liczbę ** 11 **? Nic więcej nie opisuje tego, ponieważ całkowita liczba znaków wynosi 8 (Cyfry wszystkich numerów dla pierwszego scanf() łącznie) – Thokchom
Nic innego nie opisuje liczników w innych 'scanf()' s, jeśli zakładamy, że znaki nowej linii nie są zużywane. – Thokchom
Właściwie ta linia jest pobierana z Cplusplusreference. Ale wiedziałem, co to znaczyło, mimo że została napisana w niewłaściwy sposób ... Wiedziałem, że to oznacza, że znaki są czytane ze strumienia wejściowego. – Thokchom