PDA

Prikaži potpunu verziju : Niz niski


Futuristic
29.1.2013, 17:18
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?
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;
}
Btw u printf sam dodao jos ona dva ispisa da bi video ima li ista iza \0
Primer unosa:
4 2
abcde fghijk lmnop qrst
Ispis:
ab d e
fg i j
lm o p
qr t

Lucic Nemanja
29.1.2013, 17:55
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 :D.

Stevvan
29.1.2013, 18:11
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/

Teva
29.1.2013, 22:46
a strlen varijanta? :D

Lucic Nemanja
29.1.2013, 23:42
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.


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';

boshkodj
29.1.2013, 23:57
offtopic : Au bre, nije mi jasno zasto toliko mrzim pojam "niska" za strinogove, imam slican onaj trip kao kad hardver nazivaju gvozdjurija aaaaaaaaaaaaa!