Pokazuje mi gresku negdje kod int main :(
Pokazuje mi gresku negdje kod int main :(
Strukturu završi sa ;
struct st
{
---
};
Ajd bar ti nešto radiš, kod nije loš, malo još popravi intendanciju.
printf("%s; %s ;%d\n", a[i].prezime, a[i].imena, a[i].br );
Ovo nije dobro!
Formate upisa ne odvajaš sa ; !, pišeš jednostavno:
"%s %s %d\n"
Kakve to ima veze, zasto to ne bi bilo dobro?
Pa ispisat ce mu:
ime; prezime; 213
Kakve veze ima, mozda on bas zeli odvajati to s tockom-zarez.
Mogao je napisati i:
printf("%s printaj printaj %s wtf iz tiz shieeet derp herp. %d\n", a[i].prezime, a[i].imena, a[i].br );
Totalno nebitno.
Ali zašto bi ime i prezime odvajao tačkom-zarez?
Enivej, hvala, mislio sam ako je ne odvojeno od formata da nije uredu.
Kad se dečko trudi, što ga davi nebitnim , a ne pomogne mu ono bitno
Ne radi ti jer na kraju strukture nisi stavio semicolon, a za upis char niza u funkciji scanf ne treba ti adresa.
Ovako:
#include<stdio.h>
struct adresa
{
char prezime [20];
char imena [20];
int br;
};
int main()
{
int i;
struct adresa a[3];
for(i=0; i<3; i++)
{
scanf("%s", a[i].prezime);
scanf("%s", a[i].imena);
scanf("%d", &a[i].br);
}
for (i=0; i<3; i++)
if (a[i].br%2==0)
printf("%s; %s ;%d\n", a[i].prezime, a[i].imena, a[i].br );
else
printf("Greska");
return 0;
}
Ali zašto bi ime i prezime odvajao tačkom-zarez?
Enivej, hvala, mislio sam ako je ne odvojeno od formata da nije uredu.
Pa svejedno je zasto, ima covjek valjda svoje razloge, to je uopce nebitno.
Bitno je da ono nije sintaksno krivo jer iz tvog posta moze zakljuciti da to nije moguce i da mu je to krivo, a nije. Kompajleru je jedino bitno da kad naide na string formatting operator, dakle na %s, %d itd., da budu tako oznaceni, znaci modulo_nesto (%s recimo). Cak mu nije ni bitno da se podatak koji mu dajes da zamjeni sa tim operatorom matcha s njim. Jer ako recimo stavis %d, a das mu char, recimo slovo 'a' ispisat ce ti 97, a ne 'a' zato sto si char 'a' matchal s %d formatom i nece se buniti glede toga. Sve ostalo sto se nalazi izmedu, na pocetku, na kraju tog printf-a jednostavno ce ispisati.
Hvala vam, ali ste me sada malo zbunili. NIsam bas najbolje skontala, ali cu pokusati...
Imam jos par zadataka koje sam pokusala ali ne idu...:(
Hvala vam, ali ste me sada malo zbunili. NIsam bas najbolje skontala, ali cu pokusati...
Imam jos par zadataka koje sam pokusala ali ne idu...:(
Ma samo pogledaj ovo sto je Floki napisao. Dakle, fali ti znak ';' kod deklaracije strukture. Kad to probas kompajlirati kompajler ti to i kaze, meni evo izbaci:
error: expected ‘;’, identifier or ‘(’ before ‘int'
Sam kompajler ti napise da ocekuje ';' ili '(' prije inta, malo kripticno, da, ali znas gdje je greska pa prozujis po kodu.
Drugo, kod scanf-ova stringova ti nije potreban '&' zato sto su to polja i kad napises polje[0] to je kao da si napisala *(polje + 0), zato ti ne treba & kod ta dva polja. Kod integera ti treba.
SKONTALAAA! HVALA ! AKO MI ZAPNE DRUGI DOLAZIM OPET KOD VAS DA MI OBJASNITE.....
Je l zna neko da mi uradi zadatak? Bila bih mu zahvala...
Napisati funkciju koja od datog realnog broja pravi niz karaktera koji ga predstavlja...Npr niz od 1234567 pravi niz "1234567".
Pa kreni!
Pa kreni!
Pa ne znam!
Imaš funkciju ftoa().
Da i...ako zelis uradi ako ne ne moras....Ako znas!
Pozdrav!
Pisem neki konzolni program u cistom C-u. Program cita parametre iz komandne linije i kako mi main izlgeda ovako:
int main(int argc, char* argv[])
argv[0] mi u debug modu pise fullpath do mog exe-a (d:\project1\test.exe)
argv[0] mi u release modu pise samo naziv mog exe-a (test.exe)
Sad, kako dobiti folder u kojem se nalazi moj exe?
Ako imam fullpath, isparsiram i to je ok.
Medjutim, ako imam samo naziv exe-a (Release), koristio sam ovo:
char strFolder[512];
_getcwd(strFolder, 512);
I ovo mi radi, ali nisam siguran je li to najbolji nacin, jer u debugu dobijem taj working folder, koji uopce ne mora biti taj gdje je exe.
Htio bih kod koji cita path u kojem se nalazi moj exe, a da radi i na unixu i na windowsu, bez obzira na debug/release i sl.
Hvala!
@Cvetić
Da ti uradim?, taman posla, nemam pametnijih stvari, kao ni drugi forumaši, shvati, niko ti neće uraditi zadatak bez malo tvoga truda, i dao sam ti uputu.
http://www.dreamincode.net/code/snippet545.htm
Ne moras! Hvala u svakom slucaju!
Pozdrav!
Pisem neki konzolni program u cistom C-u. Program cita parametre iz komandne linije i kako mi main izlgeda ovako:
int main(int argc, char* argv[])
argv[0] mi u debug modu pise fullpath do mog exe-a (d:\project1\test.exe)
argv[0] mi u release modu pise samo naziv mog exe-a (test.exe)
K&R Knjiga kaze da argv[0] sadrzi komandu koja je pokrenula program. To znaci ako si ti pokrenuo program pomocu "c:\program\program.exe" argv[0] ce sadrzavati taj kompletan string, a ako si ga pokrenuo pomocu "program.exe" arv[0] ce sadrzavati samo ime programa.
Probaj ovaj program:
#include <stdio.h>
int main(int argc, char **argv)
{
printf("KOMANDA: %s\n", argv[0]);
return 0;
}
kompajliraj ga, stavi ga u neki folder (recimo c:\program\), otvori cmd, kucaj:
c:
cd program
program
program.exe
c:\program\program.exe
ispis bi trebao biti:
KOMANDA: program
KOMANDA: program.exe
KOMANDA: c:\program\program.exe
Dakle to se slaze sa onime sto pise u knjizi. Treba naci nekakav drugi nacin za dolazenja do putanje programa.
Htio bih kod koji cita path u kojem se nalazi moj exe, a da radi i na unixu i na windowsu, bez obzira na debug/release i sl.
Hvala!
MSDN za _getcwd kaze da ta funkcija uzme trenutni radni direktorij. To samo po sebi nije lose, radni direktorij izvrsne datoteke pokrenute bez nekakvih posebnih kompliciranja i opcija je u biti direktorij u kojoj se ta izvrsna datoteka nalazi. ALI pri pokretanju moguce je imati drukcije postavljeni radni direktorij od onoga u kojem se nalazi sama programska datoteka (recimo to mozes promjeniti putem shortcuta). Sto znaci da u konacnici radni direktorij nije pouzdan izvor informacija za saznavanje putanje same izvrsne datoteke, jer se moze mijenjati po zelji korisnika:
Na srecu, postoji WinAPI funkcija pomocu koje mozes dobiti punu putanju izvrsne datoteke. Zove se GetModuleFileName(), toj funkciji kao jedan od argumenata treba i handle do trenutnog procesa (tvog programa koji se izvrsava) . Taj handle mozes dobiti pozivom na GetModuleHandle() kojem kao argument proslijedis NULL, i tako dobijes handle procesa koji je pozvao tu funkciju (handle do tvog programa).
#include <stdio.h>
#include <windows.h>
int main(int argc, char **argv)
{
char buffer[512];
GetModuleFileName(GetModuleHandle(NULL), buffer, 512);
printf("PUTANJA: %s\n", buffer);
return 0;
}
Problem je sto osim putanje dobijes i ime datoteke u istom stringu. To mozes sâm rucno ukloniti bez nekih problema, ili mozes koristiti funkciju PathRemoveFileSpec() koja ce to uciniti za tebe:
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
int main(int argc, char **argv)
{
char buffer[512];
GetModuleFileName(GetModuleHandle(NULL), buffer, 512);
PathRemoveFileSpec(buffer);
printf("PUTANJA: %s\n", buffer);
return 0;
}
No, da bi koristio tu funkciju moras dodati header shlwapi.h i linkati sa bibliotekom shlwapi.lib ako koristis microsoftov compiler, odnosno libshlwapi.a ako koristis mingw compiler.
Vježbam malo nešto, za par dana natjecanje.
Zapeo sam.
Ovo je zadatak.
(tl;dr; treba upisat jedan 5-znamenkasti broj, zatim 5 charova, ako je char = 'D' onda se znamenka koja je ista po redu kao i char zbraja sumi, npr. 74210, D, K, K, D, K, ispis će biti: 8, jer je 7 prva znamenka a i prvi je char bio D isto tako i za 4.)
Moje rješenje:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char broj[4];
char bar[4];
int bro[4];
int zbroj=0;
scanf ("%s", broj);
scanf ("%c", &bar[0]);
scanf ("%c", &bar[1]);
scanf ("%c", &bar[2]);
scanf ("%c", &bar[3]);
scanf ("%c", &bar[4]);
for (int x=0; x<4; x++)
{
bro[x]=atoi(broj[x]);
}
for (int i=0; i<4; i++)
{
if (bar[i] == 'D') zbroj=zbroj+bro[i];
}
printf("ZBROJ JE: %d", zbroj);
}
Kad pokrenem program, i upišem 2. char, dobijem Segmentation fault.
Ima li itko kakvu ideju?
Hvala najljepša!
Makni iz scanf-a '&'.
Makni iz scanf-a '&'.
warning: format ‘%c’ expects type ‘char *’, but argument 2 has type ‘int’
Znači sad stavim char *bar[4] ?
^ Ovo s *bar[4] nevermind, odma dobim segmentation fault lol
Imaš ti tu hrpu čudnih stvari. Jesi to uopće probao kompajlirati? Meni Code::Blox to ne želi kompajlirati! I lijepo izbaci hrpu grešaka - o čemu ti radiš, a da ti ne ispiše gdje imaš greške?
Napisao si da ti bar ima 4 elementa - a koliko ti elemenata scanf-aš? 5!
Na liniji bro[x]=atoi(broj[x]); mi ispiše grešku invalid conversion from char to const char*. Koja je svrha te linije?
Imaš ti tu hrpu čudnih stvari. Jesi to uopće probao kompajlirati? Meni Code::Blox to ne želi kompajlirati! I lijepo izbaci hrpu grešaka - o čemu ti radiš, a da ti ne ispiše gdje imaš greške?
Napisao si da ti bar ima 4 elementa - a koliko ti elemenata scanf-aš? 5!
Na liniji bro[x]=atoi(broj[x]); mi ispiše grešku invalid conversion from char to const char*. Koja je svrha te linije?
Kompajlam s gcc -std=c99. (inače Code::Blocks za edit koda)
Pa nije li 0 isto element?
Mislim u bar, nejde li 0, 1, 2, 3, 4?
U toj se liniji iz stringa brojeva, jedna po jedna znamenka sprema u bro.
Joj, sry, zajeba*l sam se, treba ici '&' kod ovih scanfova. Krivo sam gledal.
Da, 0 je indeks prvog elementa, ali ti kad definiras to polje, kazes mu KOLIKO ima elemenata, a kad ides brojiti kreces OD 0. indeksa. Dakle, char broj[4] znaci da su unutra elementi 0, 1, 2, 3.
Mislim u bar, nejde li 0, 1, 2, 3, 4?
Pa je. Upravo zato. Kako si deklarirao varijalu bar? Kao: char broj[4];
To znači da ona ima 4 elementa, a ne da elementi idu od 0 do 4 (jer je to 5 elemenata)!
Znamenke si mogao dobiti i tako da oduzmeš nulu od njih! Pa misli da sam baš na ovoj temi na prošloj stranici dao jedan takav kod. Dakle, umjesto atoi(char_varijabla) mogao si koristiti char_varijabla-'0';
Nadalje, kad unosišbroj - koliko ti je dugačak taj string? 4 elementa. Međutim, ti želiš koristiti sva četiri elementa, zar ne? Jer ga kod unosa koristiš kao string, a ne kao niz znakova. Od čega se sastoji string? Od znakova koji na kraju zaršavaju nul-znakom. To znači da ako u polje od četiri znaka uneseš string od četiri znaka, da će nul-znak prebrisati mjesto u memoriji iza toga gdje se nalazio taj niz znakova! Dakle, polje broj deklariraj s barem pet elemenata.
BTW nazivi vaijabli su ti fakat umjetnički - ne zna se što bi koja trebala značiti.
Također, zašto elemente polja bar ne učitavaš u petlji?
Prvo, u main() nemas return 0;, tako da kompajler ispisuje -Wreturn-type warning, tj. 'control reaches end of non-void function'. Popravi to.
Drugo, kao sto je mbaska pitao, zasto ne koristis for petlju za ucitavanje?
Trece, scanf() je dosta sjeba*na f-ja, erm, trebat ces flushati buffer ako zelis da ti scanf() to sve ucita. Dakle, ovako to bi izgledalo:
// code omitted
char ch;
scanf ("%s", broj);
for (i = 0; i < 4; ++i)
{
scanf ("%c", &bar[i]);
while ((ch = getchar()) != '\n' && ch != EOF); // flushanje buffera
}
// code omitted
Cetvrto, negdje je isto neka greska u liniji s atoi funkcijom, to mi se nije dalo gledati, probaj sam skuziti.
for (i = 0; i < 4; ++i)
{
scanf ("%c", &bar[i]);
while ((ch = getchar()) != '\n' && ch != EOF); // flushanje buffera
}
Zapravo mu je za flushanje buffera dovoljno getchar(); - samo se isto mora sjetiti napisati i odmah iza scanf ("%s", broj);
#include <stdio.h>
int main ()
{
char broj[5];
char bar[5];
int bro[5];
int zbroj=0;
gets(broj);
for (int i=0; i<4; i++)
{
scanf ("%c", &bar[i]);
}
for (int x=0; x<4; x++)
{
bro[x] = broj[x] - '0';
}
for (int y=0; y<4; y++)
{
if (bar[y] == 'D') zbroj = zbroj + bro[y];
}
printf ("ZBROJ JE: %d", zbroj);
return 0;
}
Evo update koda.
Bolje?
#include <stdio.h>
int main ()
{
char broj[5];
char bar[5];
int bro[5];
int zbroj=0;
gets(broj);
for (int i=0; i<4; i++)
{
scanf ("%c", &bar[i]);
}
for (int x=0; x<4; x++)
{
bro[x] = broj[x] - '0';
}
for (int y=0; y<4; y++)
{
if (bar[y] == 'D') zbroj = zbroj + bro[y];
}
printf ("ZBROJ JE: %d", zbroj);
return 0;
}
Evo update koda.
Bolje?
Zašto nas pitaš jel je bolje? Radi li ti program? Vidim da nigdje nisi koristio getchar - možeš upisati sve brojeve?
BTW čemu ovo?
bro[x] = broj[x] - '0';
Zar se to ne može napisati kao:
bro[x] -= '0';
Čemu ovo?
if (bar[y] == 'D') zbroj = zbroj + bro[y];
Zar se to ne može napisati kao:
if (bar[y] == 'D') zbroj += bro[y];
BTW zašto koristiš tri različita identifikartora za brojač? i, x, y? Razumiješ da varijable koje deklariraš unutar for (...), da te varijable ne postoje izvan petlje? Dakle, u svim tim slučajevima možeš koristiti isti identifikator - preporučjivo i. Drugu varijablu za petlju uvodiš ako imaš petlju unutar petlje, pa onda imaš i, j ili x, y. To je programerska praksa.
Zdravo. Mozete li mi pomoci...Sa tastature se ucitava broj n i niz od n brojeva, a zatim se ucitava broj k. odstampati sve elemente niza manje od k...
int i, n, k;
printf("Učitati broj elemenata");
scanf("%d", &n);
int*niz=(int*)malloc(sizeof(int)*n);
for (i=0; i<n; i++)
scanf("%d", &niz[i]);
scanf("%d", &k);
for(i=0; i<n; i++)
if(niz[i]<k)
printf("Brojevi manji od k su %d\n, niz[i]");
return 0;
}
Ali na zalost nece...