2011-06-22 19 views
5

Cóż, to podstawowe pytanie, ale wydaje mi się, że jest dość zagmatwany.Jak działa wewnętrznie fgets?

#include<stdio.h> 
int main() 
{ 
char a[100]; 
printf("Enter a string\n"); 
scanf("%s",a); 
} 

Zasadniczo powyższe jest to, co chcę osiągnąć. Gdybym wprowadź ciąg

James Bond 

potem chcę które mają być przechowywane w tablicy a. Ale problem polega na tym, że w pustej przestrzeni jest zapisane tylko słowo James. Jak mogę rozwiązać ten problem.

UPDATE
Po odpowiedziach podanych poniżej Rozumiem fgets() byłby lepszym wyborem. Chcę poznać wewnętrzną pracę fgetów, ponieważ jest ona w stanie przechowywać ciąg znaków w przestrzeni, w której scanf nie jest w stanie zrobić tego samego.

+3

Użyj 'fgets' zamiast' scanf'. Prawie zawsze. –

+0

@ Chris Lutz Chcę wiedzieć, jak działa fgets, dlaczego fgety są w stanie zaakceptować przestrzeń, ale nie skanują? –

Odpowiedz

5
+0

tak, to jest dokładnie to, co chciałem. Dzięki. Daj mi znać, jakie słowa kluczowe użyłeś, aby to uzyskać. –

+0

http://www.google.ro/search?q=fgets+source+code&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a – Quamis

0

Powinieneś użyć get (a)/fgets (a, sizeof (a), stdin) zamiast sscanf().

+0

Chcę poznać wewnętrzną pracę fgets, dlaczego jest on w stanie przechowywać ciąg znaków w miejscu, w którym scanf nie jest w stanie zrobić tego samego. –

+0

@ zarejestrowany użytkownik zobacz http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/. % s dla sscanf działa ze słowem. (dopóki nie zostanie znaleziony biały znak) – mattn

1

Scanf czyta do pierwszego znaku odstępu. Rozwiązaniem jest użycie fgets, jeśli pamięć mnie nie myli, w przypadku byłoby to:

fgets(a, 100, STDIN);

Będzie odczytać maksymalnie 100 znaków (lub najpierw \ n) ze standardowego wejścia i przechowywać go w.

Nie używaj funkcji pobierania nigdy, nawet jeśli wygląda to łatwiej.

+0

@Lainlwakura Chcę wiedzieć, jak działa fgets, dlaczego fgety są w stanie zaakceptować przestrzeń, ale nie scanf i dlaczego nie należy używać gets()? –

+1

Nie znam wewnętrznych elementów fgets(), ale nie należy używać funkcji gets(), ponieważ pobiera ona tylko wskaźnik do tablicy. Nie ma absolutnie żadnej wiedzy na temat tego, jak duża jest macierz, a nawet można ją bardzo łatwo przepełnić. Niektóre kompilatory, takie jak gcc, będą ostrzegać przed użyciem funkcji gets(). – LainIwakura

0

Spróbuj fgets():

char a[100]; 
printf("Enter a string\n"); 
fgets(a, sizeof(a), STDIN); 

Aby dowiedzieć się więcej o STDIN, check this.

+0

Chcę wiedzieć, jak działa fgets, czyli w jaki sposób fgets może przechowywać cały ciąg z białą spacją. –

+0

@ Zarejestrowany użytkownik: sprawdź link. – Donotalo

+0

Czytam twój link, który mówi o stdin, którego deskryptor pliku wynosi 0, ale nie jestem w stanie dowiedzieć się, jak robi to fgets. –

1

Zazwyczaj scanf przerywa wprowadzanie w białych znakach (spacja, tabulacja, znak nowej linii, ...).

Na przykład dane wejściowe " 5 42 -100" są akceptowane z scanf("%d%d%d"), ponieważ każdy %d usuwa początkowe białe znaki. To samo zachowanie występuje z %s.

Jedyne specyfikatorów konwersji gdzie ignorowanie wiodących spacji nie dzieje się %%, %[ i %c (a, z różnych powodów, %n)

char input[] = " hello world"; 
char buf[100]; 
sscanf(input, "%8c", buf); /* buf contains " hello w" */ 
sscanf(input, "%8[^o]", buf); /* buf contains " hell" */ 

Funkcja fgets czyta tyle znaków, ile jest , aż do przerywania linii gniazd.


używam The Open Group Base Specifications Issue 7 do dokumentacji online

Powiązane problemy