Citat:
k4rl0: Gledaj,onaj moj primjer radi,to sto si ti sad na mene ljut i
pokusavas me omalovazavat,jer sam u onom postu koristio
rijec "seljaci"(znam da nisam trebo,ispricavam se).
Upisi moj kod u Dev C++,kompajliraj,sve radi kako spada.
Amen
Čoveče ne budi smešan. Što bih ja bio ljut na tebe :))
Kod nije dobar i objasnio sam gore zašto.
Prevodilac ne prijavljuje grešku ako za ime uneseš 1 karakter, ali ako za ime uneseš reč dužine > 1, pri izlazu iz programa prijaviće se neka greška.
E sad da ti objasnim neke stvari.
Svaka promenljiva tipa string je ništa drugo do niz karaktera + 1 karakter '\0' koji označava kraj stringa.
Pa sam ti tamo gore napisao kako izgleda taj niz kad se unese reč pera.
Kad si neku promenljivu tipa string sačuvao u memoriji računara i napisao:
Code:
cout << ime;
Na glavnom izlazu će se ispisati prvi karakter(element) iz tog niza(stringa) karaktera. Zatim se piše sledeći element, pa sledeći, pa sledeći... i sve tako dok se ne dođe do karaktera '\0' koji označava kraj stringa.
Kada napišeš
Code:
char ime[10];
Ti deklarišeš jednu promenljivu ime, koja je statički niz elemenata tipa char. Prvi element pokazuje na naredni element i tako redom.
Pogledaj sad sledeći kod
Code:
#include <iostream>
using namespace std;
int main ()
{
char ime[10];
for(int i=0; i<10;)
cout << ime[i++];
system("PAUSE");
return 0;
}
Odvojio sam memorisjki prostor za niz ime i sada na glavnom izlazu hoću da ispišem svih 10 karaktera iz tog niza.
Očekuješ da na ekranu neće pisati ništa. A što ne bi pisalo?
Ti si samo dodelio memoriju tom nizu, ali nisi izbrisao sadržaj tih memorijskih lokacija. Tu se nalaze neki podaci, a ne znamo koji i na ekranu će pisati hijeroglifi.
Probaj sad samo
Code:
#include <iostream>
using namespace std;
int main ()
{
char ime[10];
cout << ime;
system("PAUSE");
return 0;
}
Situacija je malo izmenjena. Prikazano je isto što i gore i još nešto viška. Naime, poslednji član u nizu pokazuje na sledeću mem. lokaciju očekujući karakter koji signalizira kraj stringa i ispisuje ga. Pošto to nije '\0' karakter ispisuje se sadržaj te mom lokacije, a kako se odatle ne pokazuje na sledeću mem. lokaciju, tu se tvoj ispis završava.
Kada radiš
Code:
cin >> ime;
Ti kopiraš niz karaktera sa glavnog ulaza u niz ime.
Svaki element niza je zasebna mem. lokacija
Ako si za ime odvojio 10 elemenata, i uneo reč PERA, prvih 5 elemanata će biti prebrisano novim podacima, a ostali će ostati neizmenjeni.
Znači imao si
Code:
{ x, x, x, x, x, x, x, x, x, x }
sada imaš
Code:
{ 'P', 'E', 'R', 'A', '\0', x, x, x, x, x }
Sa x je označen neki slučajni sadržaj, ne znamo koji.
Kada sad odradiš
cout << ime;
Na izlazu se prvo ispiše P, taj element pokazuje na sledeću mem. lokaciju gde se nalazi 'E' i sve tako dok ne dođeš do '\0' gde se signalizira kraj i ispis završava.
Ono što si ti radio je sledeće.
Imao si niz ime
Code:
{ ' ', '\0' }
Zatim si u njega pokušao da kopiraš recimo niz
Code:
{ 'P', 'E', 'R', 'A', '\0' }
Na mesto prvog člana u nizu se kopira P, na mesto drugog E, ali tu nije kraj jer E više ne bi trebalo nigde da pokazuje, ali ono pokazuje na mem lokaciju gde se nalazi 'R', pa onda se pokazuje na 'A' i na kraju na '\0' koje ne pokazuje na ništa.
Za rezultat si stvarno imao napisano ime PERA iako je moglo da stane samo P i sad si nadam se video gde je greška.
Izvinjavam se svima ako samo malo lošije objasnio. Za ovo se treba crtati heap i steak i izuskuje više vremena, a to mi se nije dalo :D
Ko hoće detaljno i stručnije da objašnjava, slobodno. Ovo je bio samo mali hint :)
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D