Pomoc za pocetnike u C-u

poruka: 36
|
čitano: 7.898
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Pomoc za pocetnike u C-u

Postovanje svima!

Imam jedno pitanje vezano za vrsenje promjena na varijabli sa referencama u void funkciji.

Primjer funkcije 1:

 

Ovdje mi je jasno kako sam promjenio vrijednost unutar "s" stringa. Sa pointerskom aritmetikom.

#include<stdio.h>
#include<ctype.h>
void fun(char s[]);
int main(){
    char s[17];
    printf("Unesi string ne duzi od 16 znakova: ");
    scanf("%[^\n]", s);
    fun(s);
    printf("Rezultat:\"%s\"\n", s);
}
void fun(char s[]){
    char *i=s;
       for(; *i; i++){
          char c=tolower(*i);
          if(c-'a'&&c-'e'&&c-'i'&&c-'o'&&c-'u')
             *(s++)=*i;// <---- pointerska aritmetika
       }
    *s=0;
}

E sad dolazi druga verzija izvedba iste funkcije:

 

void fun(char s[]){
    int i, j=0;
    for(i=0; s[i]!='\0'; i++){
       char c=tolower(s[i]);
       if(!(c=='a'|| c=='e'|| c=='i'|| c=='o'|| c=='u'))
          s[j++]=s[i];// <---- ????
    }
    s[j]='\0';
}

Nije mi jasno zasto se string "s" promijenio a nisam koristio pointersku aritmetiku. Ili ako jesam onda mi to jos nije u potpunosti jasno.

 

Evo ovaj mali primjer odlicno pokazuje kako se vrjednost ne mijenja jer se nije prostupalo preko referenci:

 

#include<stdio.h>
void test(int a);
main(){
    int m;
    m=2;
    printf("\nM is %d",m);
    test(m);
    printf("\nM is %d\n",m);
    system("pause");
   return 0;
}

void test(int a){
    a=5;
}

I isti takav primjer ovog puta se vidi kako preko void funkcije koja ne vraca nista mjenja vrijednost preko referenci:

 

#include<stdio.h>
void test(int *ptr);
main(){
    int m;
    m=2;
    printf("\nM is %d",m);
    test(&m);
    printf("\nM is %d\n",m);
    return 0;
}
void test(int *ptr){
    printf("\nModifikacija vrijednosti unutar memoriske adrese %ld", ptr);
    *ptr=5;
}

 

Ako itko moze to malo pojasnit jer ne kuzim to nikako.

 

Hvala.

Poruka je uređivana zadnji put uto 2.2.2010 21:25 (Mr_B).
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: Pomoc za pocetnike u C-u

Radi se o tome što pointer zapravo jest. Pointer možemo zamislit kao malu kućicu u memoriji, koja pokazuje na neku adresu. Svako polje u C-u je pointer koji pokazuje na prvi element polja. E sad idu objašnjenja kako i zašto ono radi:

 

Prvi kod ti je jasan, i tu nema prevelike mudrosti.

Drugi kod:

Da se fji poslalo običan neki int, pa ga se onako mijenjalo, u mainu to ne bi bilo vidljivo. To je zato jer svaka fja napravi svoje lokalne kopije varijabli s kojima ih pozivaš, njih promijeni, a one iz maina ne dira. Kod polja je drugačije, jer si fji poslao pointer na prvi element. Fja je kopirala taj mali podatak u svoju lokalnu varijablu, no taj pointer i dalje pokaazuje na isti dio memorije kao onaj iz maina. Time se mijenjanjem nečeg u fji, mijenjaju i orginalni podaci.

 

U drugom primjeru si zalijepio dva ista koda :D

Pretpostavljam da u prvom kodu ide bez adresa i pointera, pa se tu radi o mijenjanju lokalnih varijabli fje, a u drugom se preko pointera mijenja onaj orginalni.

15 godina
neaktivan
offline
RE: Pomoc za pocetnike u C-u

A zoo!

Kuzim sad...linija 8:

fun(s);

U tome je kvaka, poslao sam pointer na prvo polje istina.

eto ocito mi pointeri nisu sjeli bas do kraja.

Hvala, hvala!

 

17 godina
protjeran
offline
Pomoc za pocetnike u C-u

Općenito vrijedi relacija između pokazivača i polja:

 

*(p+i) = p[i]

 

pa za i = 0 dobijemo

 

*p = p[0]

 

tj. pokazivač pokazuje na početni element polja.

Poruka je uređivana zadnji put uto 2.2.2010 23:34 (Tracer).
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Pomoc za pocetnike u C-u

Postovanje svima!

 

Evo jednog pitanja vezanog za char i scanf.

 

znaci kod ucitavanja samo jedne rijeci koristi se %s ili %[^ \t\n] ok

za ucitavanje cjelog reda koristi se %[^\n] ok

evo ovdje je deklariran char "string" sa odredjenom duzinom.

ucitava cjela recenica i na naknadno ispisuje.

 

#include<stdio.h>
int main(){
    char string[21];
    printf("unesi string: ");
    scanf("%[^\n]", string);
    printf("\nstring je: %s\n", string);
}

 

e sad kod koji ne radi:

 

#include<stdio.h>
int main(){
    char *string;
    int br;
    printf("Unesi duzinu stringa: ");
    scanf("%d", &br);
    string=(char*)malloc((br+1)*sizeof(char));
    printf("unesi string: ");
    scanf("%[^\n]", string);//%s
    printf("\nstring je: %s\n", string);
}

 

ovaj kod za rezultat izbacuje hieroglife.

znaci u devetoj liniju koda da sam umjesto %[^\n] stavio %s onda bi kod radio ali bi naravno ucitao samo jednu rijec.

Kako da memoriski alociram  "string" a da je moguce ucitati cijelu recenicu?

 

Onda evo jedan primjer sa scanf-om:

 

#include<stdio.h>
int main(){
    int br;
    char str[20];   
    printf("Unesi broj: ");
    scanf("%d", &br);
    printf("Unesi neko ime i prezime: ");
    scanf("%[^\n]", str);
    printf("broj je: %d dok je string: %s\n", br, str);
}

 

Da sam prvo ucitao recenicu pa onda broj kod bi radio savrseno.

Ovdje ce se broj ispisat dok ce na mjesto stringa ispast opet nesto bezveze.

sta se tu desava sa tim scanf-om? On ocito ima neki buffer i ak ima kako to ispraznit?

 

Hvala unaprijed!!

 

 

 
0 0 hvala 0
17 godina
protjeran
offline
RE: Pomoc za pocetnike u C-u

Točno. Potrebno je očistiti sve buffere koji su na neki način povezani s IO operacijama. Znači, prvi problematični code bi izgledao ovako:

 

#include<stdio.h>
#include<stdlib.h>

int main() {
    char *string;
    int br;
    printf("Unesi duzinu stringa: ");
    scanf("%d", &br);
    string = (char*)malloc((br + 1)*sizeof(char));
    flushall();  // OČISTITI BUFFERE
    printf("unesi string: ");
    scanf("%[^\n]", string); // %s
    printf("\nstring je: %s\n", string);
    free(string);  // ne zaboraviti dealocirati!
    return 0;  //..niti ovo
}

 

a drugi...

 

#include<stdio.h>
#include<stdlib.h>

#include<stdio.h>
int main(){
    int br;
    char str[20];
    printf("Unesi broj: ");
    scanf("%d", &br);
    flushall();
    printf("Unesi neko ime i prezime: ");
    scanf("%[^\n]", str);
    printf("broj je: %d dok je string: %s\n", br, str);
    return 0;
}

 

 

Nova poruka
E-mail:
Lozinka:
 
vrh stranice