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);
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);
A nie przypadkiem tak:
scanf("%s", &s1);
ZTCP, przy przekazywaniu przez referencję przed nazwą zmiennej trzeba dodać ampersand.
Raczej nie przecież przakazuję tam wskaznik
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);
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
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ę)?).
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
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.
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.
to może zamknij notatnik, w którym podglądasz zawartość, wykonaj program i sprawdź...
Ok dzieki wielkie panowie za podpowiedzi
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. */
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().