Problem z wczytanie ciągu znaków - scanf()

0

Hej, mam taki problem: chciałem wczytac string ze standardowego wejścia, jednkaże to wywołuje następujący błąd: "Warning! s1 is used uninitialized in this function"

 
printf("Podaj pierwsza liczbe: ");
char *s1;
scanf("%s", s1);
0

A nie przypadkiem tak:

scanf("%s", &s1);

ZTCP, przy przekazywaniu przez referencję przed nazwą zmiennej trzeba dodać ampersand.

0

Raczej nie przecież przakazuję tam wskaznik

0

Mea culpa; rzeczywiście ma być bez ampersanda.

Błędem jest to, iż nie alokujesz miejsca w pamięci dla s1.

Sprawdź to:

char *s1;
s1 = (char *)malloc(10);
scanf("%s", s1);
0

Ha, no tylko w tym cały ból, że ja nie chcę określac długosci tego napisu, albo raczej chcialbym zeby zostalo zaalokowane dokladnie tyle bajtow ile potrzeba na ten napis

0

To może wczytuj znak po znaku i za każdym razem przydzielaj tablicy więcej miejsca w pamięci (tak się da (chodzi o alokację)?).

0

O, to by bylo chyba to czego potrzebuje, tylko czy ta opcja przewiduje, ze podam caly napis? czy musialbym wtedy znak po znaku pisac i klikac enter

1

Funkcja _getche z conio.h
http://msdn.microsoft.com/en-us/library/kswce429(v=vs.100).aspx

Póki co nic innego mi na myśl nie przychodzi.

1

W C nie ma gotowych rozwiązań do tego. Z reguły stosuje się bufory o zadany z góry ograniczonym rozmiarze. Jeśli naprawdę ci jest to potrzebne to idź za radą @Patryk27.

Pobieraj znaki zwykłym getchar 'em. Wcale nie będziesz musiał każdego znaku potwierdzać enterem.

0

to może zamknij notatnik, w którym podglądasz zawartość, wykonaj program i sprawdź...

0

Ok dzieki wielkie panowie za podpowiedzi

0

W GLIBC (bibliotece standardowej C, którą znaleźć można w większości dystrybucji Linuksów, a desktopowych zwłaszcza) istnieje rozszerzenie, a dokładniej funkcja getline, która sama potrafi sobie przealokować bufor.

http://www.gnu.org/software/libc/manual/html_node/Line-Input.html#index-getline-994
Możesz w internecie znaleźć jej odpowiednik albo podejrzeć źródła GLIBC (http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=libio/iogetdelim.c;hb=master).

ps. z powyższych źródeł:

if (needed < 2 * *n)
needed = 2 * *n;  /* Be generous. */
0

Ogólnie to możesz zaalokować bufor jakieś sensownej wielkości (np. ktoś ma wpisać nazwisko, to daj 101 znaków) i dodaj opcje w scanfie limitującą ilość znaków (w tym przypadku "%100s", pamiętaj o '\0'). Innym rozwiązaniem będzie zaalokowanie 16 bajtów, wczytanie 15, jak wczytałeś wszystkie 15 to sprawdź, czy można wczytać znak nie będący whitespace (getc, putc), to powiększasz bufor do 32 i wczytujesz 16, jak sytuacja nadal się powtórzy to powiększasz do 64 i wczytujesz 32 kolejne itd. Zamknij to w funkcji np. get_string().

1 użytkowników online, w tym zalogowanych: 0, gości: 1