2010-10-26 12 views
5

scanf ("% s", str) nie zrobi tego. Zatrzyma czytanie na pierwszym polu. gets (str) nie działa, gdy łańcuch jest duży. Jakieś pomysły?Jak mogę odczytać ciąg znaków zawierający spacje w C?

+2

'gets' nigdy nie działa. Jest to błąd, który może spowodować, że użyjemy 'gets'. Użyj 'fgets'. –

+0

Może to moja wersja c, która nie zaakceptuje, dostaje się w ogóle ... Dzięki! – Johny

+0

@Johnny: Upomnienie R wobec używania 'gets()' jest spowodowane faktem, że używanie go wprowadza * ogromną * lukę bezpieczeństwa w twoim kodzie, nie że twój konkretny kompilator ma z tym problem (nie powinien; 'dostaje() 'było częścią C od początku). Został wycofany z wersji C99 i nie powinien być już używany. –

Odpowiedz

13

użyj fgets z STDIN jako strumieniem pliku. Następnie możesz określić ilość danych, które chcesz przeczytać i gdzie je umieścić.

+0

w rzeczywistości jest tak: – Johny

+0

fgets (str1, 100, stdin); fgets (str2, 100, stdin); Nie dostanę prośby o pierwszy ciąg. Przechodzi bezpośrednio do drugiego. Dzięki za szybką odpowiedź. – Johny

+0

Nie jestem pewien, co oznacza Twój komentarz - czy coś nie działa? –

1

Kiedy chcesz przestać czytać? W EOF, w konkretnej postaci, czy co?

Możesz przeczytać określoną liczbę znaków z% c

c dopasowuje sekwencję znaków szerokości count (domyślnie 1); następny wskaźnik musi być wskaźnikiem do znaku, a dla wszystkich znaków musi być wystarczająca ilość miejsca (bez kończącej NUL). Zwykłe pomijanie wiodącej białej przestrzeni jest pomijane. Aby najpierw pominąć białą przestrzeń , użyj jawnego spacji w formacie.

Możesz przeczytać określonych znaków (lub do tych wykluczonych) z% [

[zestawienia sekwencji niepusty z znaków z podanego zestawu akceptowanych znaków; następny wskaźnik musi być wskaźnikiem do char, i musi być wystarczająco dużo miejsca dla wszystkich znaków w ciągu , plus kończący znak NUL. Zwykły skok wiodącej przestrzeni biały jest stłumiony. Łańcuch składa się ze znaków w (lub nie w) określonego zestawu; zestaw jest definiowany przez znaki znaków między nawiasem otwartym [znak i nawias zamykający] charac- ter. Zestaw wyklucza te znaki, jeśli pierwszy znak po otwartym nawiasie jest zwarty ^. Aby umieścić w zestawie zamknięty wspornik , ustaw pierwszy znak po otwartym wsporniku lub ościeżnicy; każda inna pozycja zakończy zestaw. Znak łącznika - jest również specjalny; po umieszczeniu między dwoma innymi dodaje nowe znaki do zestawu. Aby uwzględnić łącznik, nadaj mu ostatni znak przed końcowym nawiasem zamykającym . Na przykład `[^] 0-9-] 'oznacza zbiór " z wyjątkiem nawiasu zamykającego, od zera do dziewięciu i łącznika ". ciąg kończy się wraz z pojawieniem się znaku nie w (lub z warun- cumflex, w) ustawić lub gdy szerokość pola zabraknie

+0

Po prostu nie chcę odstępów między ciąg. Próbowałem scanf ("% [^ \ n]", str); ale też nie działa. Dzięki i tak! – Johny

+0

Chcesz przeczytać całą linię? –

+0

Zgaduję, ale to oznacza do 79 znaków, prawda? Potrzebuję łańcucha, który może być większy. – Johny

2

Stwórz własną funkcję, aby przeczytać wiersz. Oto, co można w zasadzie zrobić:

 
1. fgets into allocated (growable) memory 
2. if it was a full line you're done 
3. grow the array 
4. fgets more characters into the newly allocated memory 
5. goto 2. 

Implementacja może być nieco trudne :-)

trzeba myśleć o tym, co trzeba przekazać do funkcji (przynajmniej adres tablica i jej rozmiar); i co funkcja zwraca, gdy wszystko "działa" lub kiedy wystąpił błąd.Musisz zdecydować, co jest błędem (jest ciągiem o długości 10 Gb/s bez "\ n" błędu?). Musisz zdecydować, jak rozbudować tablicę.


Edit

Faktycznie może lepiej byłoby fgetc zamiast fgets

 
get a character 
it it EOF? DONE 
add to array (update length), possible growing it (update size) 
is it '\n'? DONE 
repeat 
1

Aby przeczytać ciąg przestrzeni można zrobić w następujący sposób:

char name[30],ch; 

i=1; 
while((ch=getchar())!='\n') 
{ 
name[i]=ch; 
i++; 
} 
i++; 
name[i]='\n'; 
printf("String is %s",name); 
+0

'ch' powinno być' int', aby odróżnić 'EOF' od wszystkich innych' char'. Jak to jest teraz, 'while ((ch = getchar())! = '\ N')' jest nieskończoną pętlą, jeśli 'EOF' ma powrócić z' getchar() '. – chux

4
char str[100]; 

Spróbuj tego

scanf("%[^\n]s",str); 

czy to

fgets(str, sizeof str, stdin)) 
+0

1) Nie ma powodu dla 's' w' "% [^ \ n] s" '. 2) 'scanf ("% [^ \ n] ... 'nie skanuje niczego i nie zapisuje niczego w' str' jeśli wejście jest '" \ n "'. 3) 'scanf ("% [^ \ n] .. . "nie chroni przed dużym wejściem. 4)' scanf ("% [^ \ n] ...' pozostawia '' \ n'' w 'stdin'. – chux

Powiązane problemy