
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
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
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?
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.
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?
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.
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?
comet[i].name = uredi_ime (*comet[i].name);
comet[i].name = uredi_ime (*comet[i].name);
jer nikako ne radi
nisam baš na ti sa pokazivačima
@jurluk:
Nitko nije na ti sa pokazivačima.
Jel ti to vježbaš za vještine?
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.
Evo poslužite se.
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
comet[i].name = uredi_ime (*comet[i].name);
comet[i].name = uredi_ime (*comet[i].name);
jer nikako ne radi
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.
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)?
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
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?
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.
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
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));
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 *'
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));
opet kod pozivanja funkcije: error: void value not ignored as it ought to be|
Aj daj cijeli kod. Jer meni radi na mom primjeru.
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.
postoje vitice, prva odma iza for petlje, druga ispod break
sa free(new_name) isto neće
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
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?
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
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
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.
Može i bolje:
*strstr(comet[i].name, " ") = '\0';