29.1.2013, 17:18 | #1 |
Član
Član od: 22.11.2009.
Lokacija: Čačak
Poruke: 251
Zahvalnice: 63
Zahvaljeno 11 puta na 10 poruka
|
Niz niski
Ovako ide problem, treba da dimnamicki alociram niz char nizova, gde kao unos prvo unosim broj niski, a drugi unos odredjuje koliko ce niska imati elemenata.
Prvi problem na koji sam naleteo je da kad unosim niske one se unesu cele iako sam prethodno naznacio da je duzina niske manja, npr. duzina niske je 3 a ja sam bez problema uneo rec od recimo 5 slova. To sam resio tako sto sam na kraj niske sam stavio \0, i naizgled resio problem. Iako mi se sada niske ispisuju do duzine koje hocu, deo iste je ipak tu u memoriji posle \0 koje sam stavio. Kako da resim problem? Kod:
int main() { char **reci; int i; int n,m; scanf("%d %d",&n,&m); reci = malloc(n*sizeof(char*)); for(i=0;i<n;i++) reci[i] = malloc((m+1)*sizeof(char)); for(i=0;i<n;i++) { scanf("%s",reci[i]); reci[i][m] ='\0'; } for(i=0;i<n;i++) printf("%s %c %c\n",reci[i],reci[i][m+1],reci[i][m+2]); return 0; } Primer unosa: Kod:
4 2 abcde fghijk lmnop qrst Kod:
ab d e fg i j lm o p qr t |
29.1.2013, 17:55 | #2 |
Starosedelac
|
Re: Niz niski
Kada štampaš string printf ga ispisuje sve dok ne naiđe na terminalni znak, bez obzira da li je memorija alocirana ili ne. E sad, nisam siguran, ali koliko vidim iz tvog primera izgleda da ni scanf ne mari za to da li je memorija alocirana kada upisuje. Nisam siguran.
Uglavnom, ono što ti sa sigurnošću mogu reći jeste da nikad ne koristiš scanf za čitanje stringova. Koristi gets i getc. Najpoželjnije je da čitaš i alociraš char po char i konstantno vršiš proveru da li si prešišao dozvoljenu veličinu. Kada dođeš do granice stajes sa realociranjem i upisuješ terminalnu nulu. Tako nekad mene bejahu učili C . |
29.1.2013, 18:11 | #3 |
Veteran
|
Re: Niz niski
upravo tako scanf ne brine o memoriji, tj pretpostavlja se da je ima dovoljno. Ako su bajtovi koje nisi alocirao koriste za nesto drugo ili nisu dozvoljeni program moze da pukne. resenje moze biti da koristis getline npr gde ce ti ucitavati onoliko kolika je velicina buffera, ili dok ne naidje na \n. Alternativno resenje je da napises svoju fju, gde ces ucitavati znak po znak
EDIT: Mala ispravka nije getline u pitanju posto on nije po ansi standardu vec fgets. Evo pogledaj ovde detalje o funkciji http://www.cplusplus.com/reference/cstdio/fgets/ Poslednja ispravka: Stevvan (29.1.2013 u 21:31) |
29.1.2013, 22:46 | #4 |
Starosedelac
Član od: 23.2.2006.
Lokacija: Tamo gde su kuće od čokolade i prozori od marmelade....
Poruke: 1.579
Zahvalnice: 195
Zahvaljeno 301 puta na 171 poruka
|
Re: Niz niski
a strlen varijanta?
|
29.1.2013, 23:42 | #5 |
Starosedelac
|
Re: Niz niski
Evo ti deo nekog mog matorog koda koji je radio obradu stringova. Ovde je konkretno reč o čitanju stringa sa ulaza i dinamičkog smeštanja u memoriju. Ako hoćeš mogu i ceo kod da okačim, mada je obrada potpuno irelevantna.
Kod:
int i = 0; char *str = NULL; printf("Unesite zeljeni string za obradu.\n"); while(1) { c = getchar(); str = (char*) realloc (str, (i+1)*sizeof(char)); if (str == NULL) { printf("Greska pri alokaciji!\n"); exit(1); } if (c == '\n') break; str[i] = c; i++; } str[i] = '\0'; |
29.1.2013, 23:57 | #6 |
Veteran
Član od: 4.7.2008.
Lokacija: Somewhere along the line
Poruke: 505
Zahvalnice: 85
Zahvaljeno 34 puta na 29 poruka
|
Re: Niz niski
offtopic : Au bre, nije mi jasno zasto toliko mrzim pojam "niska" za strinogove, imam slican onaj trip kao kad hardver nazivaju gvozdjurija aaaaaaaaaaaaa!
|
Bookmarks sajtovi |
|
|
Slične teme | ||||
tema | temu započeo | forum | Odgovora | Poslednja poruka |
Niški provajderi | alex92 | Internet usluge | 40 | 4.10.2009 10:50 |