Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Jedno pitanje za string

[es] :: C/C++ programiranje :: Jedno pitanje za string

[ Pregleda: 3275 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

RMAN
Milan Đukić
student
Knićanin

Član broj: 32492
Poruke: 1166
*.neobee.net.



+5 Profil

icon Jedno pitanje za string12.11.2006. u 01:13 - pre 212 meseci
Kada deklarisem neki string u main funkciji kaze mi da je previse dugacak (too long).
Sta to moze biti i kako da resim?
Evo npr. jedan string:
.
.
.
char xxxx='10101011'; Ne radi
.
.
.

A ako stavim samo jedan broj onda radi:
.
.
.
char xxxx='1'; Radi
.
.
.
Eureka!

MILAN DJUKIC
D J U K A
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Jedno pitanje za string12.11.2006. u 01:21 - pre 212 meseci
char je karakter a ne string, tebi treba niz karaktera (e to vec lici na stirng).

imas generalno dva nacina, a na tebi je da otrkijes male tajne koji svaki od njih nosi:

char *s="1234";
char s[]="1234";


[Ovu poruku je menjao chupcko dana 12.11.2006. u 10:35 GMT+1]
CHUPCKO
 
Odgovor na temu

Tiristor
Skola/obrazovanje

Član broj: 102849
Poruke: 184
*.inffo.net.



Profil

icon Re: Jedno pitanje za string12.11.2006. u 07:33 - pre 212 meseci
Jos jedan razlog sto ti ono gore ne radi jeste sto si stavio pod jednostruke znake navoda, to je za upis jednog karaktera, njegovog koda, za string moras da stavis pod dvostruke znake navoda, da bi ga racunalo kao string, jer u tom slucaju ce na kraju stringa d doda null terminator ('\0'), i onda pri ispisu tog stringa sa konverzijom %s ne bi trebalo da bude problema, jer ona ispisuje do null terminatora. Trebalo bi i tako da radi, meni je radilo, ali je ispravnije ovo sto ti je chupcko napisao. Mozda je laksi ovaj drugi nacin, da posle ne bi morao da obracas paznju na to kada ispisuje adresu, a kada ono sto se na toj adresi nalazi, kod pokazivaca, kako je naveo chupcko u prvom primeru.
 
Odgovor na temu

toxi_programer
Nemanja Todić
Beograd

Član broj: 104396
Poruke: 464
*.smin.sezampro.yu.

Sajt: www.articles411.com


+8 Profil

icon Re: Jedno pitanje za string12.11.2006. u 15:46 - pre 212 meseci
Evo "isecaka" iz mog tutriala o ovome.

7.3 Promenljive tipa char
(napomena: u ovom odeljku su stvari prikazivane malo slikovito zbog lakseg razumevanja )

Char je tip promenljive koji moze da cuva samo jedan simbol(znak, slova, broj...). ’n’ je simbol, preciznije slovo. Na drugoj strani „n“ je niz simbola. Zasto? Uskoro cete saznati, za sada je bitno da uvidite da se simbol stavlja pod jednostruke navodnike( ’ ’ ) a niz simbola(string) pod regularne navodnike( “ “ ).
Razmotrimo inicializaciju:
char slovo = ’a’;
Na prvi pogled, slovo ce sadrzati vrednost ’a’. Nije bas tako. Promenljive koje su tipa char mogu da cuvaju samo brojeve, kao i int, ali posto char ima samo jedan bajt najveca vrednost koju moze cuvati je 255. Kako onda promenljivoj char mozemo dodeliti neki simbol kada unau stvari cuva brojeve? Postoji „tabela“ u kojoj se nalaze simboli(ukupno 255 njih) i svaki simbol ima svoj redni broj. Mi mozemo proslediti decimalni broj( a on se nalazi u rasponu od 0 do 255) tabeli i kao rezultat cemo dobiti simbol koji je pod tim rednim brojem. Primera radi, simbol ’a’ ima vrednost 97 u toj tabeli pa ce promenljiva slovo iz gornjeg primera cuvati vrednost od 97 a ne sam simbol. Odavde se da zakljuciti da je slovo moglo biti i tipa int. Sledi program koji ce na ekran(tacnije na konzolu) ispisati sve simbole i njihove redne brojeve:

/* PROGRAM TABELA_SIMBOLA */
#include <stdio.h>
void main(void)
{
int simb;

for(simb = 0; simb < 255; simb++)
printf("%d %c \n", simb, (char)simb);
}


Obratimo paznju na red koji sadrzi funkciju prontf(). Prvo se prikazuje decimalna vrednost promenljive simb, i tu je sve jasno. Zatim smo koristeci upravljackog znaka %c rekli da na tom mestu treba da se ispise neki znak. To govori funkciji da umesto decimalne vrednosti koju bude dobila treba da ispise odgovarajuci simbol iz tabele. Kao treci argument smo naveli (char)simb .Ovde smo izvrsili eksplicitnu konverziju( objasnjeno u odeljku 3.3) ali to nam i nije bilo potrebno jer ce funkcija printf() sama izvrsiti konverziju(inplicitnu) iz razloga sto ona kao treci argument ocekuje promenljivu tipa char a ne tipa int.
Mali detalj: Do sada ste za prelazak u novi red koristili ’\n’. Pokrenite ponovo gornji program i obratite paznju na simbol pod rednim brojem deset. Nema nista, a ispod njega je prazan red. Razlog ovome je taj sto se pod rednim brojem 10 nalazi upravo znak za novi red- ’\n’.

7.4 Niz promenljivih tipa char
Pogledajmo nacine na koje mozemo deklarisati i inicializovati ovu vrstu promenljivih:
char TEST[] = “toxi“;
char TEST[] = { ’t’, ’o’, ’x’, ’i’ };
Bitno je znati da samo ime nizovske promenljive pretstavlja konstantni pokazivac na prvi element tog niza. Sto ce reci da cemo ako napisemo: TEST; ili &test[0]; dobiti istu stvar- adresu prvog elementa niza.
Sta mislite koliko TEST, u gornjem primeru ima elemenata? Ako ih prebroite naicice te na broj 4. Ipak, TEST ima 5 elemenata. Da bi prikazali vrednost TEST-a napisacemo ovu naredbu:
printf(“%s “, TEST);
Koristili smo upravljacki znak %s kojim signaliziramo da zelimo prikazati string(niz char-ova). Funkciji printf() smo predali adresu prvog elementa niza( jer smo jos predali: TEST , sto je adresa prvog elementa tog niza). Printf() prikazuje element po element... Kako ce znati kada je kraj niza? Da bi to omogucili, na kraj svakog stringa se dodaje jos jedan znak – ’\0’ ( kosa crta unazad i nula) koji dakle signalizira kraj stringa. Sada treba da vam je jasno zasto u gornjem primeru TEST ima 5 a ne 4 elementa. I to je veoma bitna stvar!
Da bi utvrdili nauceno, napisacemo dva mala programa:

/* PROGRAM VEZBA_1 */
#include <stdio.h>

void func(int a)
{
a = 123;
}

void main(void)
{
int broj = 7;

printf("Vrednosti BROJ pre poziva func() je %d \n", broj);
func(broj);
printf("Vrednosti BROJ posle poziva func() je %d \n", broj);
}

Trebalo bi da vam je jasno zasto ce vrednost promenljive broj ostati ista i posle poziva funkcije func().
Drugi program je ovaj:

/* PROGRAM VEZBA_2 */
#include <stdio.h>
#include<string.h>

void func(char a[])
{
strcpy(a, "nova_vrednost");
}

void main(void)
{
char broj[20] = "todic";

printf("Vrednosti BROJ pre poziva func() je %s \n", broj);
func(broj);
printf("Vrednosti BROJ posle poziva func() je %s \n", broj);
}

Vrednost je promenjena, zato sto smo funkcije func() predali samo ime promenljive broj dakle adresu prvog elementa. Samim tim func() je u mogucnosti da menja vrednost broj-a (zasto je to tako vec smo govorili tako da bi trebalo da vam je to jasno).
Obratimo paznju na to da smo ukljucili jos jedan header fajl- string.h . Ovo smo uradili jer nam je bila potrebna funkcija strcpy() – ona sluzi za dodeljivanje jednog stringa drugom. Pašće vam na pamet da smo mogli da napišemo:
a = “nova_vrednost“;
Medjutim to nije omoguceno pa se za dodavanje nove vrednosti stringu koristi funkcija strcpy(). O ovim funkcijama cemo govoriti u narednim poglavljima.
Za kraj cemo jos jednom napomenuti da je veoma vazno da za niz char-ova izdvojite dovoljno mesta u memoriji, dakle ogromna je greska napisati:
char ime[5];
strcpy(ime, “Pera Detlic“);
Uvek obratite paznju na ovo!

 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Jedno pitanje za string13.11.2006. u 11:49 - pre 212 meseci
Cisto da kazem da je moguce nesto ovako:

char *a;

a = "1234";
...
a = "5678";

i to ce raditi lepo :) a i logicno je.

"abcd" je ustvari zamena za sledece: negde u rom (ne nuzno) memoriji smesticemo 5 bajtova sa vredonscu 'a' 'b' 'c' 'd' '\0' i ceo taj izraz zamenicemo sa adresom (kastovanom u char*).

Cak se moze pisati i nesto tipa: "abcd"[2] ili "1234567"[j] gde je j neki int.

Savet: proucite kako sve to funcionise ispod maske ....

P.S. char *a = "abcd"; a[0] = 'x'; da li ovo moze ili ne ?

[Ovu poruku je menjao chupcko dana 14.11.2006. u 11:52 GMT+1]
CHUPCKO
 
Odgovor na temu

SuPeR_MaSteR
Marko Stamenković

Član broj: 88590
Poruke: 115
*.inffo.net.



Profil

icon Re: Jedno pitanje za string14.11.2006. u 01:10 - pre 212 meseci
Moze.
Ali pri ispisivanju ne moze se koristiti operator []
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Jedno pitanje za string14.11.2006. u 10:52 - pre 212 meseci
Code:

[chupcko] 0 /home/chupcko => cat a.c
#include <stdio.h>

int main(void)
{
  char *a = "abcd";
  
  a[0] = 'x';
  puts(a);
  return 0;
}
[chupcko] 0 /home/chupcko => make a
cc     a.c   -o a
[chupcko] 0 /home/chupcko => ./a
Segmentation fault
[chupcko] 139 /home/chupcko =>


Ajmo opet, "abcd" se smesta ako moze u ROM ...

Sto se tice ispisa, kako ne moze [] prilikom ispisa, mislis na ovo:

Code:

[chupcko] 0 /home/chupcko => cat a.c 
#include <stdio.h>

int main(void)
{
  char a[] = "abcd";
  
  puts(a);
  return 0;
}
[chupcko] 0 /home/chupcko => make a
cc     a.c   -o a
[chupcko] 0 /home/chupcko => ./a
abcd
[chupcko] 0 /home/chupcko =>


ili na ovo:

Code:

[chupcko] 0 /home/chupcko => cat a.c 
#include <stdio.h>

int main(void)
{
  char *a = "abcd";
  
  printf("%c\n", a[2]);
  return 0;
}
[chupcko] 0 /home/chupcko => make a
cc     a.c   -o a
[chupcko] 0 /home/chupcko => ./a
c
[chupcko] 0 /home/chupcko =>


CHUPCKO
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.adsl.net.t-com.hr.

Sajt: www.dump.hr


Profil

icon Re: Jedno pitanje za string14.11.2006. u 14:24 - pre 212 meseci
Zasto ROM?
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Jedno pitanje za string14.11.2006. u 14:38 - pre 212 meseci
Tako kaze standard, zato sto su racunali da ce tako da ustede nesto :). Generalno dosta kompajlera stavlja u neki segment koji ne moze da se menja, na primer code segment :). U svakom slucaju nije pametno bazirati program na tome da ce moci neki string zadat preko konstante menja :).

CHUPCKO
 
Odgovor na temu

cynique
Ivan Štambuk
Zagreb@Croatia

Član broj: 93690
Poruke: 155
*.cc.fer.hr.

ICQ: 106979934
Sajt: istambuk.blogspot.com


Profil

icon Re: Jedno pitanje za string14.11.2006. u 15:21 - pre 212 meseci
Između ostaloga i zato što uvijek netko može npr. preko mprotect(2) odnosno VirtualProtect() izmjeniti protekciju page-eva na kojima se nalaze ti konstantni podaci, i izmjeniti ih :)

Može i jednostavnije - izmjeniti masku protekcije sekcije za takve podatke u PE/ELF executable-u tako da bude r/w umjesto r/o, što se u biti svodi da izmjenu jednog jedinog bita :)
 
Odgovor na temu

[es] :: C/C++ programiranje :: Jedno pitanje za string

[ Pregleda: 3275 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.