Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 29.1.2013, 17:18   #1
Futuristic
Član
 
Član od: 22.11.2009.
Lokacija: Čačak
Poruke: 251
Zahvalnice: 63
Zahvaljeno 11 puta na 10 poruka
Određen forumom 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;
}
Btw u printf sam dodao jos ona dva ispisa da bi video ima li ista iza \0
Primer unosa:
Kod:
4 2
abcde fghijk lmnop qrst
Ispis:
Kod:
ab d e
fg i j
lm o p
qr t
Futuristic je offline   Odgovor sa citatom ove poruke
Stara 29.1.2013, 17:55   #2
Lucic Nemanja
Starosedelac
 
Član od: 2.12.2005.
Lokacija: Beograd
Poruke: 1.241
Zahvalnice: 65
Zahvaljeno 76 puta na 49 poruka
Slanje poruke preko Skypea korisniku Lucic Nemanja
Određen forumom 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 .
Lucic Nemanja je offline   Odgovor sa citatom ove poruke
Stara 29.1.2013, 18:11   #3
Stevvan
Veteran
 
Član od: 17.12.2005.
Lokacija: Zarkovo, Beograd
Poruke: 1.114
Zahvalnice: 97
Zahvaljeno 179 puta na 104 poruka
Slanje poruke preko MSN-a korisniku Stevvan Slanje poruke preko Skypea korisniku Stevvan
Određen forumom 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)
Stevvan je offline   Odgovor sa citatom ove poruke
Stara 29.1.2013, 22:46   #4
Teva
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
Određen forumom Re: Niz niski

a strlen varijanta?
Teva je offline   Odgovor sa citatom ove poruke
Stara 29.1.2013, 23:42   #5
Lucic Nemanja
Starosedelac
 
Član od: 2.12.2005.
Lokacija: Beograd
Poruke: 1.241
Zahvalnice: 65
Zahvaljeno 76 puta na 49 poruka
Slanje poruke preko Skypea korisniku Lucic Nemanja
Određen forumom 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';
Lucic Nemanja je offline   Odgovor sa citatom ove poruke
Stara 29.1.2013, 23:57   #6
boshkodj
Veteran
 
Član od: 4.7.2008.
Lokacija: Somewhere along the line
Poruke: 505
Zahvalnice: 85
Zahvaljeno 34 puta na 29 poruka
Određen forumom 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!
boshkodj je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi


Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Niški provajderi alex92 Internet usluge 40 4.10.2009 10:50


Sva vremena su po Griniču +2 h. Sada je 13:22.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com