2011-07-05 21 views
7
#include <stdio.h> 
int main(int argc, char* argv[]) { 
    char c; 
    scanf(" %c", &c); 
    printf("%c\n", c); 
    return 0; 
} 

[[email protected]]# ./scanf 
a 
a 

[[email protected]]# ./scanf 
h 
h 

Wydaje się, że zawsze pasuje do tego, czy istnieje przestrzeń, dlaczego?Co oznacza spacja w scanf?

+1

http://linux.die.net/man/3/scanf, http://www.manpagez.com/man/3/scanf/, http://unixhelp.ed.ac.uk/CGI/ man-cgi? scanf + 3, GIYF – sehe

Odpowiedz

9

Białe znaki (takie jak wykroje, kart lub znaków nowej linii) w ciągu formatu dopasować dowolną ilość białej przestrzeni, w tym żaden, w wejściu.

http://www.manpagez.com/man/3/scanf/

+0

Czy pasuje do klawisza 'RETURN'? –

+1

@Je Rog: Nie pasuje do "kluczy". Dopasowuje znaki wejściowe * znaki *. Znak nowej linii jest uważany za spację, więc tak, pominie znak nowej linii. – AnT

+0

Tak, spacja może być używana do dopasowania "nowej linii". Uważaj, w systemie Windows, gdy naciśniesz RETURN, zwykle wysyła "\ r \ n", a w Linuksie "\ n". Ale dla prostego numerycznego skanowania wejścia, zwykle nie ma to znaczenia, ponieważ konwersja liczbowa zatrzyma się, gdy tylko uderzy w cyfrę ("." - "i" + "są dozwolone w zależności od rodzaju skanowanego wejścia) –

4

Przestrzeń w scanf Format oznacza "pomiń wszystkie spacje" od aktualnej pozycji na. Ponieważ większość specyfikatorów formatu scanf będzie już pomijać wszystkie spacje przed próbą odczytania czegokolwiek, spacja nie jest najczęściej używana w formacie scanf. Jednak w przypadku korzystania ze specyfikatora formatu, który nie ignoruje białych znaków, w tym spacja w formacie, gdy jest to konieczne (wymuszenie pominięcia) może mieć sens.

Specyfikatory, które nie ignorują białych znaków, to: c[ i n. Tak więc określenie spacji przed jednym z tych specyfikatorów stanowi różnicę. W przeciwnym razie nie ma to znaczenia. W twoim konkretnym przykładzie białe spacje są ignorowane, ponieważ użyłeś spacji w twoim formacie scanf (ponieważ używasz %c). Spróbuj usunąć przestrzeń i zobaczyć, co się stanie.

2

spacją w ciągu formatu zignoruje 0 lub więcej znaków białych znaków z wejścia aż do pierwszej nie spacją.

1

documentation for scanf mówi:

Dyrektywa składa się z jednego lub więcej white-space znaków powinny być wykonywane przez odczytywanie wejścia dopóki nie więcej ważny wejściowe mogą być odczytywane lub do pierwszego bajtu, który nie jest biały znak, który pozostaje nieprzeczytany.

A także

wejściowe spacje (jak określono przez isspace) są pomijane, o ile konwersja obejmuje określenie, [C, C lub N specyfikator konwersji.

Oznacza to, że potrzebne jest miejsce w łańcuchu formatującym. Jeśli jechaliśmy odczytać liczbę całkowitą, jednak przestrzeń byłaby zbędna:

/* equivalent statements */ 
scanf(" %d %d %d", &v1, &v2, &v3); 
scanf("%d%d%d", &v1, &v2, &v3); 
0

% c nie pominie białymi char jako liczbowe formatu Specyfikatory zrobić. Więc jeśli używasz:

#include<stdio.h> 
int main(int argc, char* argv[]){ 
    char c; 
    scanf("%c", &c); 
    printf("%c\n", c); 
    scanf("%c", &c); // Try running with and without space 
    printf("%c\n", c); 
    return 0; 
} 

Jest bardzo prawdopodobne, że poprzedni biały znak w buforze wejściowym zostaną podjęte w drugim scanf, a nie dostaniesz szansę na typ. Spacja przed% c spowoduje, że scanf pominie w buforze wejściowym dowolny znak odstępu, abyś mógł poprawnie wprowadzić swoje dane wejściowe. Czasami, aby uzyskać ten sam efekt piszą:

fflush(stdin); 
scanf("%c" &c); 

Ale to jest uważane za bardzo złe programowania jak C standard określa zachowanie fflush (stdin) jest niezdefiniowane. Dlatego zawsze używaj spacji w łańcuchu formatu, chyba że masz konkretny powód, aby dobrze uchwycić białe znaki.