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

Glup problem sa stringom???

[es] :: C/C++ programiranje :: C/C++ za početnike :: Glup problem sa stringom???

[ Pregleda: 2298 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Aleksa Stankovic

Član broj: 147264
Poruke: 38
*.smin-1.sezampro.yu.



Profil

icon Glup problem sa stringom???30.04.2008. u 11:12 - pre 194 meseci
Meni deluje jako glupo da ovo ne radi, mora da je resenje jako prosto, ali evo koda:
Code:

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

int strlen(char *s)
{
    int n;
    for(n=0; s[n]!='\0'; n++);
    return n;
}
int main(void)
{
    char *rec;
    FILE *in;
    in=fopen("vezba.txt","r");
    fscanf(in,"%s",rec);
    int n=strlen(rec);
    printf("%d\n",n);
    for ( int i=0; i < n; i++)
    printf("3");
  //  printf("%s ", rec);
    return 0;
}

problem je u redu:
Code:

for ( int i=0; i < n; i++)
printf("3");


ukapirao sam da je problem jer nece da uporedi promenljivu i i n, sto mi uopste nema logike(obe su tipa int, n se stampa normalno itd.)
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Glup problem sa stringom???30.04.2008. u 11:49 - pre 194 meseci
Šta taj program treba da radi i kakavu grešku ili neočekivani rezultat si dobio?

Na osnovu prikazanog, čita prvu liniju iz fajla vezba.txt i to do prvog blanko-a. Rezultat stavlja u nealocirani deo memorije *rec. Ispisuje koliko je slova pročitao i isto toliko puta ispisuje ceo procitani string (zapravo broj "3" koji je tu iz meni nepoznatog razloga)

Citat:

char *rec;

Ovo treba da bude recimo:
Code:
 
char rec[100]; //<--- maksimalna ocekivana duzina linije (da ne zalazimo u dinamicko alociranje)


Citat:

fscanf(in,"%s",rec);

Možda je bolje fgets, jer čita ili celu liniju (CR/LF) ili dok ne dodje do postavljenog limita (100):
Code:
 
fgets(rec, 100, in);


Citat:

int n=strlen(rec);

strlen() vec postoji u standardnoj biblioteci, tako da je ne moras sam pisati (sem ako to nije zahtev zadatka).

 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
*.smin-1.sezampro.yu.



Profil

icon Re: Glup problem sa stringom???30.04.2008. u 12:32 - pre 194 meseci
Ovo sam radio da bi naucio nesto. Probaj da kompajliras i videces gresku prijavi gresku...
Znam za ovo sto si mi rekao ali to mi nije bio cilj programa. Hocu malo da produbim znanje o pointerima i stringovima.
Funkcija strlen radi ispravno i sve je ok, cak i stampa string(stavio sam u text.txt string blala.
stampa i duzinu stringa...

Ali mi nije jasno sledece:

On dobije duzinu (n) stringa(5);
Onda ja uradim najnormalniju for petlju
Code:

for ( int i=0; i < n; i++)
printf("3");

i ona ne radi. Tu je nesto cudno.
Koristim Code::Blocks i Mingw gcc, probao sam i preko dev cpp i nece da radi.

Osnovna stvar koja mi nije jasna je:
Kako to da ako uspe da ucita string, odredi duzinu, ne moze da odradi ovu for petlju n puta(gde je n duzina stringa...)???

P.S. Tu meni nesto nije normalno!

I da, probaj razne verzija ovog koda uz minimalne promene, opet se desava nesto cudno?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Glup problem sa stringom???30.04.2008. u 14:06 - pre 194 meseci
Tvoj kod (sa izmenom char rec[100];) kod mene proizvodi sledece:

5
33333Press any key to continue . . .

...sto je ocekivano: ima pet karaktera (blala) i pet puta ispise trojku.
(Borland kompajler)
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
*.smin-1.sezampro.yu.



Profil

icon Re: Glup problem sa stringom???30.04.2008. u 14:36 - pre 194 meseci
Ma to je OK, znam...

Ali je problem ova moja originalna verzija koda... Mene zanima gde je greska u njoj, to jest hocu da uradim ovo preko

char *rec; a ne preko rec[100] jer mi se ne svidja to ogranicenje, tj hocu da procitam bez ogranicenja...

Inace probaj recimo ove kodove(preko char *rec), i videces da rade savrseno(makar kod mene)
1:
Code:

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

int strlen(char *s)
{
    int n;
    for(n=0; s[n]!='\0'; n++);
    return n;
}
int main(void)
{
    char *rec;
    FILE *in;
    in=fopen("vezba.txt","r");
    fscanf(in,"%s",rec);
    int n=strlen(rec);
    printf("%d\n\n",n);
    printf("%s ", rec);
    return 0;
}


2:
Code:

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

int strlen(char *s)
{
    int n;
    for(n=0; s[n]!='\0'; n++);
    return n;
}
int main(void)
{
    char *rec;
    FILE *in;
    in=fopen("vezba.txt","r");
    fscanf(in,"%s",rec);
    int n=strlen(rec);
    printf("%d\n\n",n);
    for (int i=0; i< n; i++)
    printf("%d ", n);
    return 0;
}


3:
Code:

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

int strlen(char *s)
{
    int n;
    for(n=0; s[n]!='\0'; n++);
    return n;
}
int main(void)
{
    char *rec;
    FILE *in;
    in=fopen("vezba.txt","r");
    fscanf(in,"%s",rec);
    int n=strlen(rec);
    printf("%d\n\n",n);
    for (int i=0; i< n; i++)
    printf("%d ", i);
    return 0;
}


Mogu se napraviti i drugi primeri koji pokazuju da je ucitavanje stringa iz fajla na ovaj nacin(char *rec) moguce...
Ono sto je vazno je kako je to moguce da ako sve ove verzije koda rade ne radi i ovo:
4:
Code:

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

int strlen(char *s)
{
    int n;
    for(n=0; s[n]!='\0'; n++);
    return n;
}
int main(void)
{
    char *rec;
    FILE *in;
    in=fopen("vezba.txt","r");
    fscanf(in,"%s",rec);
    int n=strlen(rec);
    printf("%d\n\n",n);
    for (int i=0; i< n; i++)
    printf("%s ", rec);
    return 0;
}


Ne zanima me ucitavanje, ili to da ne znam kako da uradim neki zadatak, ja tek ucim C, pa me zanima zasto ovo ostalo radi, a verzija 4: ne. Znaci, znam da se ovo moze uraditi na drugi nacin, ali to nije poenta... Zanima me sta ne valja ovde???

Hvala za dosadasnju pomoc...
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.static.ikomline.net.



Profil

icon Re: Glup problem sa stringom???30.04.2008. u 15:12 - pre 194 meseci
Jako cudna stvar se desava oko ovoga. Meni na linuxu nece da radi ako mu stavim char *rec (pise "segmentation fault"), i pretpostavio sam da se to desava jer memorija nije nigde alocirana. Onda sam pomislio da stavim "char *rec = (char*)malloc(100)" i to je naravno radilio. Medjutim pomislio sam da ako stavim umesto 100 npr. 1 program nece raditi ako je rec veca od 1 karaktera (btw, onda to nije rec vec je slovo :D), ali je program radio :) Ni meni nije jasno zasto se ovo desava pa bih voleo da ako neko da da neko objasnjenje. Ja pretpostavljam da je fscanf f-ja ima veze sa ovim. Btw, evo i kod:

Code:


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

int strlen(char *s)
{
    int n;
    for(n=0; s[n]!='\0'; n++);
    return n;
}
int main(void)
{
    char *rec;
    rec = (char *)malloc(1); 
    FILE *in;
    in=fopen("vezba.txt","r");
    fscanf(in,"%s",rec);
    fclose(in);

    int n=strlen(rec);
    printf("%d\n",n);
    int i;

    for (i=0; i < n; i++)
       printf("3");
    printf("\n%s\n ", rec);
    return 0;
}



The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Glup problem sa stringom???30.04.2008. u 15:46 - pre 194 meseci
Kao što sam već u prvom postu rekao char *rec; je samo jedna rezervisana memorijska lokacija koja ce nekada pokazivati na podatke tipa char. Da bi program 100% radio, potrebno je da alociraš dovoljno memorije da bi smestio celu rečenicu, inace može doći do preklapanja delova memorije i propratnih problema.

Kako ćeš rezervisati memoriju (malloc ili neka konstanta), odnosno 'izmeriti' koliko treba, to je na tebi. U današnje vreme postoje kontejnerske klase koje sve to rešavaju iza paravana i ne mora se uopšte voditi računa. Recimo, kod C++ STL biblioteke napraviš vektor stringova, i to je to.

Razlog zbog čega ti program pod Linuxom u jednom slučaju jeste radio a u drugom nije, verovatno je u tome što je malloc rezervisan prostor 'malo dalje' (na heapu) odnosno nije na stacku gde je sam pokazivač. Dalje, ako se dobro sećam, čak i alokacija jednog bajta zapravo rezerviše malo više, ali to je već druga priča za nekoga ko bolje poznaje tu materiju...


 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
*.smin-1.sezampro.yu.



Profil

icon Re: Glup problem sa stringom???01.05.2008. u 19:10 - pre 194 meseci
Citat:
StefanJer91: Jako cudna stvar se desava oko ovoga. Meni na linuxu nece da radi ako mu stavim char *rec (pise "segmentation fault"), i pretpostavio sam da se to desava jer memorija nije nigde alocirana. Onda sam pomislio da stavim "char *rec = (char*)malloc(100)" i to je naravno radilio. Medjutim pomislio sam da ako stavim umesto 100 npr. 1 program nece raditi ako je rec veca od 1 karaktera (btw, onda to nije rec vec je slovo ), ali je program radio Ni meni nije jasno zasto se ovo desava pa bih voleo da ako neko da da neko objasnjenje. Ja pretpostavljam da je fscanf f-ja ima veze sa ovim. Btw, evo i kod:

Code:


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

int strlen(char *s)
{
    int n;
    for(n=0; s[n]!='\0'; n++);
    return n;
}
int main(void)
{
    char *rec;
    rec = (char *)malloc(1); 
    FILE *in;
    in=fopen("vezba.txt","r");
    fscanf(in,"%s",rec);
    fclose(in);

    int n=strlen(rec);
    printf("%d\n",n);
    int i;

    for (i=0; i < n; i++)
       printf("3");
    printf("\n%s\n ", rec);
    return 0;
}



Mislim da sam ukapirao zbog cega se ovo desava:

Code:
rec = (char *)malloc(1); 

tu se alocira jedno prazno mesto u memoriji(npr a=225342). Kada fscanf funkcija ucitava string(5 slova u ovom slucaju) ona prvo slovo stavi na mesto a tako drugo slovo stavi na memoriju a+1, i ne proverava da li je to mestu zauzeto, tj da li je to mesto rezervisano za dat string(u ovom slucaju rec). Tako on stavi slovo na mesto koje je najcesce vec zauzeto... Kasnije ponasanje programa je nepredvidljivo... Potpuno je isto i napisati rec[1], opet se javlja ista stvar. Zato se mogu dalje napisati razne stvari, recimo:

rec[45]='d';
znaci, na memorijskoj lokaciji rec+45 se nalazi char 'd'(zapravo broj... )
Kod naravno radi, ali ovo je neispravno...
Citat:

Razlog zbog čega ti program pod Linuxom u jednom slučaju jeste radio a u drugom nije, verovatno je u tome što je malloc rezervisan prostor 'malo dalje' (na heapu) odnosno nije na stacku gde je sam pokazivač.

Zapravo, razlog zbog koga je njemu nije radio ovaj kod pod Linuxom(bez malloc-a), se moze najlakse videti iz ovog koda:
Code:

#include <stdio.h>

int main()
{
    int *a;
    printf("%d", a);
    return 0;
}

Meni ovo radi jer kada stavim int *a, on vec ima neku adresu, pa meni ovaj kod vraca ovo:

2147319808

probajte ovo na Linux-u(ja nemam Linux), i ja mislim da ce se pojaviti error...


Na Linux-u ovo nije slucaj jer prilikom deklarisanja int *a, a nema nikakvu memorijsku alokaciju, pa prvo moras da mu das bilo koju lokaciju da bi program znao gde da upise string...(mozda se ovo razlikuje od kompajlera do kompajlera, ja nemam pojma, koristim samo gcc...)

Nadam se da sam bio jasan...



I, naravno, hvala vam na pomoci...
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.static.ikomline.net.



Profil

icon Re: Glup problem sa stringom???02.05.2008. u 09:21 - pre 194 meseci
Citat:

tu se alocira jedno prazno mesto u memoriji(npr a=225342). Kada fscanf funkcija ucitava string(5 slova u ovom slucaju) ona prvo slovo stavi na mesto a tako drugo slovo stavi na memoriju a+1, i ne proverava da li je to mestu zauzeto, tj da li je to mesto rezervisano za dat string(u ovom slucaju rec). Tako on stavi slovo na mesto koje je najcesce vec zauzeto... Kasnije ponasanje programa je nepredvidljivo...


Da, moguce da se nesto tako desava, ali kako onda printf f-ja ispise tacno onoliko koliko je ucitala slova, umesto da ispise onoliko kolika je velicina stringa a, u ovom slucaju samo 1 slovo. Dakle, kako komp zna da je ucitano vise od 1 slova? Moguce da radi tako sto ispisuje dok nestigne do '\0', to meni jedino izgleda logicno.

Citat:

Potpuno je isto i napisati rec[1], opet se javlja ista stvar.


Pa i nije bas :) Tj program se izvrsi ali na kraju pise Segmentation fault

Citat:

Zapravo, razlog zbog koga je njemu nije radio ovaj kod pod Linuxom(bez malloc-a), se moze najlakse videti iz ovog koda:
...
Meni ovo radi jer kada stavim int *a, on vec ima neku adresu, pa meni ovaj kod vraca ovo:

2147319808

probajte ovo na Linux-u(ja nemam Linux), i ja mislim da ce se pojaviti error...


Nece se pojaviti error program isto radi, meni izbacuje vrednost -1208549952 :) Btw, na linuxu se isto koristi gcc. Koliko ja znam to se zove divlji pointer, jer se ne zna na sta on pokazuje

The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Glup problem sa stringom???02.05.2008. u 15:47 - pre 194 meseci
Citat:

Dakle, kako komp zna da je ucitano vise od 1 slova? Moguce da radi tako sto ispisuje dok nestigne do '\0', to meni jedino izgleda logicno.

Upravo. Radi se o tzv null-terminated funkcijama koje ne polaze ni od kakve druge pretpostavke sem da NULL oznacava kraj necega sto treba da obrade, u konkretnom slucaju ispisu.

Ocigledno je da takav pristup manipuclaciji stringovima (iako brz) dovodi do brojnih nezeljenih (nenamernih) problema, pa su stoga usvojene brojne druge metode. Recimo STL string je jedno od resenja.
 
Odgovor na temu

Aleksa Stankovic

Član broj: 147264
Poruke: 38
*.smin-1.sezampro.yu.



Profil

icon Re: Glup problem sa stringom???02.05.2008. u 16:32 - pre 194 meseci
Kao sto rekoh, nemam Linux, mada je meni normalno radilo( isto ) i sa char rec[1]...
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Glup problem sa stringom???

[ Pregleda: 2298 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

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