2013-05-27 19 views
7

Jestem nowicjuszem uczącym się C i próbującym zrozumieć poniższy kod z wykładu online. Skanuje ciąg znaków dla liczby całkowitej; jeśli napotkane zostaną znaki, sscanf się nie powiedzie.zachowanie sscanf/wartość zwracana

int n; char c; 
if (sscanf(string, " %d %c", &n, &c) == 1) 
    //return the integer 

else 
    // fail 

Przeczytałem strony podręcznika systemowego dla sscanf i nadal mam wątpliwości dotyczące sprawdzenia wartości zwracanej i przyczyny działania tego kodu. Stanowią one, że "Te funkcje zwracają liczbę przypisanych elementów wejściowych".

Jeśli sscanf napotka tylko znaki, zapisuje je do & c ... ale w takim przypadku & n nie zostanie zapisane. W tym przypadku, myślałem, że wartość zwracana sscanf nadal będzie 1?

+2

'sscanf' nie przeskoczy nad'% d' do zjedzenia '% c'. Jeśli nie napotka pierwszej liczby, zwróci 0. –

+0

Z jakiegoś powodu fakt, że sscanf zrobił to ściśle w sekwencji (zgodnie z łańcuchem formatu) całkowicie mi umknął. Dzięki! – drjimmie1976

Odpowiedz

6

W przypadku, gdy sscanf pomyślnie odczytał %d i nic więcej, zwrócił wartość 1 (przypisano jeden parametr). Jeśli byłyby znaki przed liczbą, zwrócony zostałby 0 (nie przypisano żadnych parametrów, ponieważ wymagane było najpierw znalezienie liczby całkowitej, która nie była obecna). Jeśli istniała liczba całkowita z dodatkowymi znakami, zwracałaby ona 2, ponieważ mogła przypisać oba parametry.

+0

Dzięki. Myślałem, że zachowanie było po prostu do przechowywania, niezależnie od porządku, stąd zamieszanie. – drjimmie1976

2

Możesz zawsze sprawdzić, co funkcja zwraca poprzez umieszczenie go w printf oświadczenie jak poniżej:

printf("%d",sscanf(string, " %d %c", &n, &c)); 

To będzie prawdopodobnie wyczyścić wątpliwości drukując wartość zwracaną sscanf na terminalu.

Ponadto można to sprawdzić: cplusplus : sscanf

Mam nadzieję, że pomogło :)

+0

Czy chodziło Ci o 'printf ("% d \ n ", sscanf (ciąg,"% d% c ", & n, &c));'? – rootkea

+0

Tak, dzięki za wzmiankę :) –

4

Twój sscanf(string, " %d %c") powróci EOF, 0, 1 lub 2:

2: Jeśli wejście pasuje do następujących
[Opcjonalne spacje] [cyfry dziesiętne *] [Opcjonalne spacje] [dowolny znak] [dodatkowy ignorowany]

1: Jeśli wejście powiodło powyżej, ale dopasowane następujące
[Opcjonalnie obowiązuje] [cyfry dziesiętne *] [Opcjonalnie obowiązuje] [ma więcej danych]

[korekta]
0: Jeśli wejście po white-space i opcjonalny znak, nie znaleziono cyfry: przykłady: "z" lub "-".

EOF: Jeśli dane wejściowe były puste "" lub tylko białe znaki.

  • cyfry po przecinku mogą być poprzedzone znakiem znak + lub -.