2013-05-18 21 views
5

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 

Odpowiedz

7

wyjątkiem pierwszego, przechowuje licznik całkowitej liczby znaków wprowadzanych z konsoli, w tym nowej linii (enter klucze)

Jesteś misinterpreting że. Aby uzyskać końcowe znaki nowej linii używane do wysłania danych wejściowych do programu, nowa linia jest pozostawiana w buforze, aby zostać zużyta przez , scanf. Wszystkie oprócz pierwszego scanf zużywają znak nowej linii z poprzedniego wejścia jako pierwszy znak.

Pierwsza scanf zużywa osiem cyfr plus trzy nowe linie między czterema liczbami, które składają się z 11 znaków.

Drugi pobiera nowy wiersz po czwartym numerze przeczytanym w pierwszym numerze scanf, plus dwie cyfry, tworzy 3 znaki.

Trzeci: znak nowej linii, trzy cyfry, znak nowej linii, dwie cyfry: 7 znaków.

Czwarty: nowa linia, cztery cyfry: 5 znaków.(wówczas nowego wiersza + 2 cyfry dla b)

przy okazji, twój cytat

Liczba znaków w ciągu formatu już przetwarzane są przechowywane w spiczastym lokalizacji.

jest nieprawidłowy, to nie jest to liczba znaków w ciągu formatu, ale liczba znaków odczytanych ze strumienia wejściowego:

Odpowiedni argumentem powinien być wskaźnikiem do liczba całkowita ze znakiem, do którego należy zapisać liczbę znaków odczytanych z ze strumienia wejściowego do tej pory przez to wywołanie funkcji fscanf.

+0

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

+0

Nic innego nie opisuje liczników w innych 'scanf()' s, jeśli zakładamy, że znaki nowej linii nie są zużywane. – Thokchom

+0

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