C program - greška kad dođe do % u printf

poruka: 409
|
čitano: 99.183
|
moderatori: XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf
Tom69 kaže...
Zato što računaš period prije nego što si uopće učitao podatke iz datoteke. {#}

Također string učitaj s %39s, a ne %39c.

eee, hvala za ovo sa %39s. ja se dosad patio kako da maknem onaj višak iza imena Sramim se

Atomska bubamara
Poruka je uređivana zadnji put ned 16.1.2011 18:58 (jurluk).
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

eh, sad zbog toga dolazim do problema

 

kad linija izgleda ovako:

 

C/2010 X1 (Elenin)                     |2000|20110910.7432 | 0.482467 |1.000000 |343.8093 |323.2268 |  1.8388 | 8.0 |10.0 | MPEC 2011-A67

to naravno ne radi, jer sa formatom %s uzima string do prvog razmaka. znači da ipak moram ići sa %c

 

kako onda maknut one razmake da u izlaznoj datoteci ne izgleda

 

"C/2010 X1 (Elenin)                     " "Sol"

 

nego

 

"C/2010 X1 (Elenin)" "Sol"

 

i kako maknut onu kosu crtu između C i 2010?

Atomska bubamara
17 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf
jurluk kaže...

eh, sad zbog toga dolazim do problema

 

kad linija izgleda ovako:

 

C/2010 X1 (Elenin)                     |2000|20110910.7432 | 0.482467 |1.000000 |343.8093 |323.2268 |  1.8388 | 8.0 |10.0 | MPEC 2011-A67

to naravno ne radi, jer sa formatom %s uzima string do prvog razmaka. znači da ipak moram ići sa %c

 

kako onda maknut one razmake da u izlaznoj datoteci ne izgleda

 

"C/2010 X1 (Elenin)                     " "Sol"

 

nego

 

"C/2010 X1 (Elenin)" "Sol"

 

i kako maknut onu kosu crtu između C i 2010?

 

char *trim(char *str) {
  char *end;

  // Trim trailing space
  end = str + strlen(str) - 1;
  while(end > str && *end == ' ') end--;

  // Write new null terminator
  *(end+1) = 0;

  return str;
}

 

...

 

comet.name[39] = '\0';
trim(comet.name);

 

A kosu crtu možeš pronaći sa strchr pa ju zamjeniti s razmakom ili čime već. Ako hoćeš spojiti C i 2010 onda ćeš morati kopirati sve poslije kose crte za jedno mjesto ulijevo.

 

 

Poruka je uređivana zadnji put ned 16.1.2011 21:06 (Tom69).
16 godina
neaktivan
offline
C program - greška kad dođe do % u printf

kako iz main funkcije nekoj drugoj proslijediti polje. ako se ne varam to ide nekako pomoću pokazivača. i kako da onda u toj drugoj funkciji preko for petlje prođem kroz sve elemente? može neki kod za primjer?

Atomska bubamara
 
0 0 hvala 0
17 godina
offline
RE: C program - greška kad dođe do % u printf

Proslijediš pokazivač na prvi član polja  i uz to broj elemenata polja kao drugi argument

 

 

 

#include<stdio.h>

 

 

void ProslijediPolje(int* polje, int brojElemenata)

{

int i;

for(i=0; i< brojElemenata; i++)

{

printf("%d ", polje[i]);

}

}

 

 

 

 

int main()

{

int polje[5] = {1, 2, 3, 4, 5};

ProslijediPolje(polje, 5);

}

Kod char nizova ne trebaš čak ni drugi argument tj. broj elemenata, broj elemenata polja odrediš tako da petlja vrti do zaključnog '\0' znaka.

Poruka je uređivana zadnji put pon 17.1.2011 21:45 (Floki).
16 godina
neaktivan
offline
C program - greška kad dođe do % u printf

aaa, ne mogu više, mozak mi se preforsiro...

 

uglavnom. trebam iz main funkcije proslijedit drugoj funkciji polje od 40 znakova (30 + \0). ta nova funkcija treba prolazit element po element i kad uoči da su dva razmaka zaredom, onda do mjesta prije razmaka prepisuje elemente u novo polje, a na mjesto gdje je uočila prvi razmak upisuje \0. ovako nekak izgleda ta funkcija

 

char uredi_ime (char *name) {

    int i, n=0;
    char *new_name;

    for (i=0; i<=40; i++) {
       if (name[i]==' ' && name[i+1]==' ')
       n=i;
    }

    for (i=0; i<n; i++) {
       new_name[i]=name[i];
   
    new_name[n]='\0';
}

 

jel to dobro? i kak da sad u main funkciji pozovem ovu funkciju. kak točno da upišem? sa zvjezdicom, bez zvjezdice kako? Sramim se

 

       comet[i].name = uredi_ime (*comet[i].name);


       comet[i].name = uredi_ime (*comet[i].name);
jer nikako ne radi Neodlucan

nisam baš na ti sa pokazivačima

Atomska bubamara
 
0 0 hvala 0
16 godina
odjavljen
offline
C program - greška kad dođe do % u printf

@jurluk:

 

Nitko nije na ti sa pokazivačima.

 

Jel ti to vježbaš za vještine?

Ukoliko vam je mobitel u kvaru, ili ga želite prodati, zovite ovaj broj- 091 172 6697 ili posjetite stranicu- http://mobiservis.webs.com/
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf
ne, to ja radim sebi jedan program :D

pošto već ne kužimo pokazivače, mogli bi nam ovi maheri malo i objasnit :D
Atomska bubamara
16 godina
odjavljen
offline
RE: C program - greška kad dođe do % u printf
jurluk kaže...
ne, to ja radim sebi jedan program :D

pošto već ne kužimo pokazivače, mogli bi nam ovi maheri malo i objasnit :D

 Tako sam i ja radio jedan program, dok nisu kolokviji počeli. {#} Sada čuči na desktopu i čeka. Jbg. Ista sudba je pogodila moje učenje Linuxa i terminala.

Ukoliko vam je mobitel u kvaru, ili ga želite prodati, zovite ovaj broj- 091 172 6697 ili posjetite stranicu- http://mobiservis.webs.com/
17 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf
jurluk kaže...
ne, to ja radim sebi jedan program :D

pošto već ne kužimo pokazivače, mogli bi nam ovi maheri malo i objasnit :D

Evo poslužite se.

 

http://www.eskimo.com/~scs/cclass/notes/sx10.html

Q: a kako se to linux ponasa kad crkne hdd? A: zastekava svakih 60 sec,ali prezivi se
16 godina
neaktivan
offline
C program - greška kad dođe do % u printf

Nisan odavno pisa nista u c-u, pa ako san sta falia zanemarite ali evo par savjeta testaj pa javi rezultat (neman vrieman da pisen cili program sad)

 

ugl kad pozivas funckciju dosta je prosljedit to polje npr.

 

ako u mainu imamo 

 

int polje[30];

 

//i funckiju

 

int funkcija(int *aaa)

 

//onda bi poziv treba izgledat ovako:

 

int funckija(polje)

 

Sta se tice samih pointera ako si napisa char *pointer to samo znaci da imas jedan pokazivac koji pokazuje na char ne i da je ono alociralo memoriju (ako se nevaram)

 

Znaci ako si napisa gore char *newName onda trebas napisat i na sta ce on pointat npr

 

int polje[50]

 

int *pointer

 

pointer = polje;

 

Ako pak neznas velicinu polja (sta je pretpostavljam kod tebe slucaj) onda moras memoriju dinamiski alocirat

 

 

Puno toga san ode nabacia nabrzaka, a i sa pointerima san se vise bavia u c++, iako bi sve trebalo bit slicno / isto testaj pa javi probat cu pomoc ako buden zna

 
0 0 hvala 1
15 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf
jurluk kaže...
jel to dobro? i kak da sad u main funkciji pozovem ovu funkciju. kak točno da upišem? sa zvjezdicom, bez zvjezdice kako? Sramim se

 

       comet[i].name = uredi_ime (*comet[i].name);


       comet[i].name = uredi_ime (*comet[i].name);
jer nikako ne radi Neodlucan

nisam baš na ti sa pokazivačima

Treba ici:

 

comet[i].name = uredi_ime (comet[i].name);

 

Kada stavis zvjezdicu ispred imena pointera onda radis s onime na sto pointer pokazuje, kada ju izostavis onda radis sa memorijskom adresom koja pokazuje na neku vrijednost u memoriji.

 

How much wood would a woodchuck chuck if a woodchuck could chuck wood?
17 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf
jurluk kaže...

aaa, ne mogu više, mozak mi se preforsiro...

 

uglavnom. trebam iz main funkcije proslijedit drugoj funkciji polje od 40 znakova (30 + \0). ta nova funkcija treba prolazit element po element i kad uoči da su dva razmaka zaredom, onda do mjesta prije razmaka prepisuje elemente u novo polje, a na mjesto gdje je uočila prvi razmak upisuje \0. ovako nekak izgleda ta funkcija

 

snip

Korisna vježba, ali zašto ne koristiš funkcije iz <string.h> za to, strstrza pronalazak dvostrukog razmaka ("  ") i strncpy za kopiranje prvih n znakova?

Time izbjegavaš potrebu dokumentiranja što to točno funkcija uredi_ime radi.

I da, prije kopiranja bi trebao alocirati memoriju s malloc.

 

BTW, u kojem okruženju radiš i kompajliraš s obzirom da ti ne baca upozorenja i exceptione za to (ili baca)? {#}

16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf
Tom69 kaže...

BTW, u kojem okruženju radiš i kompajliraš s obzirom da ti ne baca upozorenja i exceptione za to (ili baca)? {#}

naravno da baca. hh

 

btw. GNU GCC

 

sad ću probat vaše prijedloge pa javim

 

edit:

evo sad sam probao ovako i ne radi Neodlucan

 

funkcija izgleda ovako:

 

char uredi_ime (char *name) {

    int i, n;
    char *new_name;

    for (i=0; i<=40; i++) {
       if (name[i]==' ' && name[i+1]==' ')
       n=i;
    }

    new_name = (char*) malloc (n*sizeof(char));

    for (i=0; i<n; i++)
       new_name[i]=name[i];

    new_name[n]='\0';
}

 

a pozivam ju ovako:

 

       comet[i].name = uredi_ime (comet[i].name);
gdje griješim?

 

javlja grešku

error: incompatible types when assigning to type 'char[40]' from type 'char'|

to je za ovu liniju gdje pozivam tu funkciju

 

i jel treba još na kraju funkcije return nešto?

Atomska bubamara
Poruka je uređivana zadnji put uto 18.1.2011 2:06 (jurluk).
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

Funkcija ti vraća char, a koliko vidim njenu povratnu vrijednost pridružuješ char*-u. I da, naravno da fali return ako fja vraća char :D

Btw opreza sa granicom kod prve petlje, ako ti je riječ dugačka 40 znakova, ovaj i+1 će otić izvan toga.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

bez brige budi, stavio sam 40 samo zato što je zapravo 39 + \0. a najduža riječ će zapravo imat nekih 35 znakova

 

i, hmm, jel možeš preuredit onaj moj kod, jer nisam baš pohvato šta trebam napravit Neodlucan

Atomska bubamara
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

Probaj ovo:

 

char* uredi_ime (char *name, int duljina)
{
    int i, n=duljina;
    char *new_name;

    for (i=0; i<duljina-1; i++)
       if (name[i]==' ' && name[i+1]==' ')
         { n=i; break; }
   
    new_name = (char*) malloc (n*sizeof(char));

    for (i=0; i<n; i++)
       new_name[i]=name[i];

    new_name[n]='\0';
    free(name);
   
    return new_name;
}

 

poziv:

comet[i].name = uredi_ime (comet[i].name, strlen(comet[i].name));

 

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

heh, u liniji gdje u main funkciji pozivam fju uredi_ime, izbacuje grešku

 

error: incompatible types when assigning to type 'char[40]' from type 'char *'

Atomska bubamara
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

Ok, očito ima problem sa char* i ograničenim nizom charova. Probaj ovo:

 

void uredi_ime (char *name, int duljina)
{
    int i, n=duljina;
    char *new_name;

    for (i=0; i<duljina-1; i++)
       if (name[i]==' ' && name[i+1]==' ')
         { n=i; break; }
   
    new_name = (char*) malloc (n*sizeof(char));

    for (i=0; i<n; i++)
       new_name[i]=name[i];

    new_name[n]='\0';
    strcpy(name,new_name);
   
    free(new_name);
}

 

poziv (bez pridruživanja ičega):

uredi_ime (comet[i].name, strlen(comet[i].name));

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
Poruka je uređivana zadnji put uto 18.1.2011 11:50 (Luuka).
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

opet kod pozivanja funkcije: error: void value not ignored as it ought to be|

Atomska bubamara
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

Aj daj cijeli kod. Jer meni radi na mom primjeru.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

evo kod: http://pastebin.com/xr4LQbcm

 

primjer datoteke koju obrađuje: http://pastebin.com/mBA7jZQQ

Atomska bubamara
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

Trebaš free(new_name) u funkciji. To ti je možda greška, da ne pregledavam sad sve. I vitice kod n=i; break;

Nisu tam bezveze. Doslovce copy-pasteaj kod.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
Poruka je uređivana zadnji put uto 18.1.2011 12:00 (Luuka).
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

postoje vitice, prva odma iza for petlje, druga ispod break

 

sa free(new_name) isto neće

Atomska bubamara
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

Za if moraju bit vitice

ne

for { if } nego for if {}

 

I makni pridruživanje u pozivu. Drito kopiraj linije kak sam ih napisao

ne nešto=uredi__ime

nego samo

uredi_ime

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

ahaa, sad sam stavio vitice

 

a skužio sam u čemu je problem. u main funkciji sam deklarirao polje comet.name[39+1], a ono koje dolazi iz funkcije uredi_ime nema toliko znakova i to stvara probleme. kako to riješit, opet dinamičkom alokacijom memorije, ali ovaj put u main funkciji ili kako?

Atomska bubamara
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

Nema veze. Kad staviš char s[40] to znači da će imati maximalno 39 znakova, ne točno 39. Tako da je i manji string ok.

Btw meni uz promjene koje sam napisao kod radi

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf
Luuka kaže...
I makni pridruživanje u pozivu. Drito kopiraj linije kak sam ih napisao

ne nešto=uredi__ime

nego samo

uredi_ime

sad sam tek ovo skužio :D

 

i kad ga kompajliram, nema grešaka, ali program ne radi dobro.

 

kad odaberem npr 5 kometa, odradi dobro, ali nije uklonio razmake iz imena

a kad odaberem sve komete, 210, onda se sruši

Atomska bubamara
Poruka je uređivana zadnji put uto 18.1.2011 12:19 (jurluk).
16 godina
neaktivan
offline
RE: C program - greška kad dođe do % u printf

Opcija koju još možeš pokušati je ovo:

 

void uredi_ime (char *name, int duljina) {

    int i, n=duljina;

    for (i=0; i<duljina-1; i++)
       if (name[i]==' ' && name[i+1]==' ')
         {  n=i;  break; }
   
    name[n]='\0';
}

 

Ovako će samo ubacit \0 tamo di treba završit riječ, i sve fje sa stringovima rade do \0 pa nema problema. Jedino što će ostat viška memorije zauzeto, ali nije tak strašno budući da su charovi mali :D

 

Probaj s ovakvom funkcijom, ona niš ne radi sa memorijom, možda mu je u tome bio problem.

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
17 godina
neaktivan
offline
C program - greška kad dođe do % u printf

Može i bolje:

*strstr(comet[i].name, "  ") = '\0';

 

{#}

 
0 0 hvala 1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice