
Programiranje u C-u - od svega pomalo


Zanima me koja je oznaka odnosno specifikator za "unsigned long long int" tip podataka.
Možeš li objasniti što te zapravo zanima? Nije mi baš najjasnije. A inače, možeš si pogledati ovu stranicu.
A ono kad se najavljuju varijable u funkcijama printf i scanf.
Npr. int je: "%d", long int je: "%ld" itd.
Sad me zanima kako ide "unsigned long long int"
Sad je to sasvim druga priča. Imašovdje raspravu o tome. Pa pogledaj, isprobaj i javi što ti radi.
E hvala uspio sam!
Inače unsigned long long int je:"%llu"

aaa aaa aaa
i tako deset redova toga, kao rezultat mi izbroji 90 znakova i 30 rijeci.
Program ce pogresno brojati ako imas razmake prije prve rijeci u recenici i poslije zadnje rijeci u recenici, te ako imas vise od jednog razmaka izmedu rijeci, ali to se lako sredi, samo moras malo prosiriti uvjete...
Koji program? Mislis kako fgets zna da mora ici u novi red, ili kako ova petlja cita cijelu datoteku? Gledaj fgets cita onoliko znakova koliko mu ti naredis, ali ako dode do kraja linije prije nego je procitao broj znakova koje si mu nalozio onda nece nastaviti u drugu liniju nego ce ti vratiti samo ono sto je uspio procitati iz trenutne linije. Tako da ti svaki poziv na fgets u biti cita liniju po liniju...
Evo, probao sada opet tvoj kod i normalno radi, ocito je da sam to vecer samo jedan dio prepravio pa nisam cjeli kod c/p napravio pa nije radilo. Sada prekopirao citav kod, radi normalno. Hvala. ;)
Da to sam skuzio da u fgets(), ovaj num znaci koliko znakova da procita, kada dodje do kraja recenice, tj. vrijednosti 0, on prestane citati. Nego meni nije jasno kada se petlja vrti, kako on ne cita uvijek prvi red, jer ja ne vidim da su redovi indeksirani, niti igdje navodim u funkciji da u svakom drugom krugu petlje cita drugu recenicu. Znaci on kada odvrti jednu petlju, procita jedan red, on si negdje umemorira da mora preci u taj sljedeci red kada se vrti novi krug petlje? Buni me to, jer nema indeksa nigdje nikakvog da zna. To me zanima.

Nego meni nije jasno kada se petlja vrti, kako on ne cita uvijek prvi red, jer ja ne vidim da su redovi indeksirani, niti igdje navodim u funkciji da u svakom drugom krugu petlje cita drugu recenicu. Znaci on kada odvrti jednu petlju, procita jedan red, on si negdje umemorira da mora preci u taj sljedeci red kada se vrti novi krug petlje? Buni me to, jer nema indeksa nigdje nikakvog da zna. To me zanima.
Aaaa to tebe muci. Onaj file pointer koji moras slati funkcijama koje rade s datotekama je zapravo struktura sa podatcima o otvorenoj datoteci, i jedna od informacija koja je u njoj spremljena je lokacija u datoteci na kojoj se trenutno nalazis.
Recimo ovako, otvoris datoteku sa fopen, tvoja lokacija je trenutno nula (znaci prvi bajt u datoteci). Recimo da pozoves nakon toga tri puta funkciju fgetc koja cita samo jedan bajt, i tada ti je pozicija na trecem bajtu u datoteci. Tada pozoves funkciju fread, i naredis joj da procita 4 bajta, trenutna pozicija se uveca za 4 itd, itd...
Znaci C za tebe broji gdje si stao u datoteci i samo nastavlja odatle, a ako zelis utjecati na svoju poziciju u datoteci bez citanja, za to imas funkcije fseek i fsetpos.

Aha, sad mi je logika nekog zapisanog dokumenta promjenjena. Znaci file pointer ima i svoju trenutnu lokaciju koja ima normalno neku vrijednost, koja je ubiti indeksirana kako ja nazivam gore u postu. Ubiti kako koja funkcija ima svrhu tako i povecava taj njegov brojac, kao sto sam sad shvatio da fgets povecava za jedan uvijek.
Hvala puno na pomoci oko zadatka, stringa i file-ova u C-u!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char bssid[20];
char essid[20];
char channel[10];
char interface[10];
//ukucavanje podataka
printf (" Molim ukucajte BSSID: ");
scanf ("%s",bssid);
printf ("\n Molim ukucajte ESSID: ");
scanf ("%s",essid);
printf ("\n Molim ukucajte CHANNEL: ");
scanf ("%s",channel);
printf ("\n Molim ukucajte interface: ");
scanf ("%s",interface);
//pocetak
system ("airmon-ng start %s",interface);
system ("airodump-ng -c %s -w zeko --bssid %s %s", channel, bssid, interface);
return 0;
}
Izbaci grešku da je previše argumenata u boldanim dijelovima programa.
Any ideas?
Hvala!

Aha, sad mi je logika nekog zapisanog dokumenta promjenjena. Znaci file pointer ima i svoju trenutnu lokaciju koja ima normalno neku vrijednost, koja je ubiti indeksirana kako ja nazivam gore u postu. Ubiti kako koja funkcija ima svrhu tako i povecava taj njegov brojac, kao sto sam sad shvatio da fgets povecava za jedan uvijek.
Hvala puno na pomoci oko zadatka, stringa i file-ova u C-u!
Nisi bas dobro shvatio. Osnovna mjerna jedinica s kojom datotecne funkcije rade je jedan bajt a ne jedna linija. Fgets ce povecati taj brojac ne za jedan (jedna linija po tvojoj logici), nego za broj znakova koje je procitao...
Uvijek se racuna sa bajtovima. Isto tako, datoteke zapravo nemaju "linije", imaju samo znakove koji oznacavaju pocetak nove linije. Ti znakovi su Carriage return (Cr) i Line feed (Lf). Cr ima vrijednost 13, a Lf ima vrijednost 10. Na linuxu se za razliku od windowsa za oznacivanje kraja linije koristi samo line feed znak.
Opet, slika vrijedi 1000 rijeci:

...
system ("airmon-ng start %s",interface);
system ("airodump-ng -c %s -w zeko --bssid %s %s", channel, bssid, interface);
return 0;
}
Izbaci grešku da je previše argumenata u boldanim dijelovima programa.
Any ideas?
Hvala!
System nije printf pa da mu mozes proslijedivati komande za formatiranje kao i printf-u, nego je veoma jednostavna naredba koja kao input prima samo jedan obican string koji proslijedi konzoli iliti terminalu.
Prvo koristi sprintf da u buffer u memoriji isprintas formatirani string, i onda taj buffer proslijedi funkciji system.
ovako:
char buffer[300];
sprintf(buffer, "airmon-ng start %s", interface);
system (buffer);
sprintf(buffer, "airodump-ng -c %s -w zeko --bssid %s %s", channel, bssid, interface);
system (buffer);

wepcrack.c: In function ‘main’:
wepcrack.c:29:1: warning: passing argument 1 of ‘sprintf’ from incompatible pointer type
/usr/include/stdio.h:361:12: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
wepcrack.c:30:1: warning: passing argument 1 of ‘system’ from incompatible pointer type
/usr/include/stdlib.h:717:12: note: expected ‘const char *’ but argument is of type ‘char **’
wepcrack.c:32:1: warning: passing argument 1 of ‘sprintf’ from incompatible pointer type
/usr/include/stdio.h:361:12: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
wepcrack.c:33:1: warning: passing argument 1 of ‘system’ from incompatible pointer type
/usr/include/stdlib.h:717:12: note: expected ‘const char *’ but argument is of type ‘char **’
Hmmm...
Help?

Help?
makni zvijezdicu iz char *buffer[300]
treba ici char buffer[300]
omaklo mi se... sorkac :p

makni zvijezdicu iz char *buffer[300]
treba ici char buffer[300]
omaklo mi se... sorkac :p
Np.
A to je pointer ako je zvjezdica tu?

Np.
A to je pointer ako je zvjezdica tu?
Pa da, u biti sam napravio polje od 300 pokazivaca na char, umjesto polje od 300 charova xD

Ok.
Riješio sam sve OSIM:
Moraju se otvorit dva prozora, jedan prima pakete/čita što već, dok ih drugi šalje...
Ima tko ideju kako da u C-u na linuxu otvorim 2 prozora?
Hvala!

Najjednostavniji nacin ti je napisati dva programa, svaki bi onda pisao po vlastitom prozoru terminala (bar to tako na winsima radi), zasto moraju biti 2 prozora? Kozmeticki razlog ili se programi bas moraju izvrsavati svaki u svom terminalu da bi mogli normalno funkcionirati?

Najjednostavniji nacin ti je napisati dva programa, svaki bi onda pisao po vlastitom prozoru terminala (bar to tako na winsima radi), zasto moraju biti 2 prozora? Kozmeticki razlog ili se programi bas moraju izvrsavati svaki u svom terminalu da bi mogli normalno funkcionirati?
Dok jedan skuplja paketa to ide polako.
Ali kad pokreneš ovog koji šalje, veći će se promet ostvariti, pa će ovi prvi ići puno brže (to ti olakšava krekiranje).

U tom slucaju, ovo sam iskopao:
http://stackoverflow.com/questions/5426598/opening-a-new-terminal-window-executing-a-command
http://www.linuxquestions.org/questions/linux-desktop-74/open-a-command-in-new-terminal-603919/
http://www.unix.com/programming/38080-terminal-device-control-through-c-c-program.html

U tom slucaju, ovo sam iskopao:
http://stackoverflow.com/questions/5426598/opening-a-new-terminal-window-executing-a-command
http://www.linuxquestions.org/questions/linux-desktop-74/open-a-command-in-new-terminal-603919/
http://www.unix.com/programming/38080-terminal-device-control-through-c-c-program.html
Našao u međuvremenu.
Ali sad, kako da printam malo u jedan malo u drugi terminal....
Idem guglat...

Aha, sad mi je logika nekog zapisanog dokumenta promjenjena. Znaci file pointer ima i svoju trenutnu lokaciju koja ima normalno neku vrijednost, koja je ubiti indeksirana kako ja nazivam gore u postu. Ubiti kako koja funkcija ima svrhu tako i povecava taj njegov brojac, kao sto sam sad shvatio da fgets povecava za jedan uvijek.
Hvala puno na pomoci oko zadatka, stringa i file-ova u C-u!
Nisi bas dobro shvatio. Osnovna mjerna jedinica s kojom datotecne funkcije rade je jedan bajt a ne jedna linija. Fgets ce povecati taj brojac ne za jedan (jedna linija po tvojoj logici), nego za broj znakova koje je procitao...
Uvijek se racuna sa bajtovima. Isto tako, datoteke zapravo nemaju "linije", imaju samo znakove koji oznacavaju pocetak nove linije. Ti znakovi su Carriage return (Cr) i Line feed (Lf). Cr ima vrijednost 13, a Lf ima vrijednost 10. Na linuxu se za razliku od windowsa za oznacivanje kraja linije koristi samo line feed znak.
Opet, slika vrijedi 1000 rijeci:
Jel onda ovako? Ako uzmemo u obzir ovaj tekst "Ovo je\nneki tekst\nsa tri linije teksta"
Znaci imam 3 stringa koji svaki zauzima po 100 bajtova. Normalno sam ih unio sa funkcijom gets.
Znaci ovi stringovi su ovako poredani (ovo je ujedno i pitanje)
01001111(O)|01110110(v)|01101111(o)|00100000(SPACE)|01101010(j)|01100101(e)|00001101(CR)|00001010(LF) - 8B
01101110(n)|01100101(e)|01101011(k)|01101001(i)|00100000(SPACE)|
|01110100(t)|01100101(e)|01101011(k)|01110011(s)|01110100(t)|00001101(CR)|00001010(LF) - 12B
01110011(s)|01100001(a)|00100000(SPACE)|01110100(t)|01110010(r)|01101001(i)|00100000(SPACE)|
|01101100(l)|01101001(i)|01101110(n)|01101001(i)|01101010(j)|01100101(e)|00100000(SPACE)|
|01110100(t)|01100101(e)|01101011(k)|01110011(s)|01110100(t)|01100001(a) - 22B
Naravno bez ovih pregrada '|' i sve je u jednom redu. Kada je pregrada na pocetku to znaci da bi trebalo biti zajedno sa proslim redom, ali ne stane na bug toliko siroki tekst. Znaci svaki znak je 1B iliti 8b. E sad pitanja.
Zasto kada deklariram string od 100B mogu upisati 100 znakova? Gdje se svrste onda 'LF' i 'CR'?
Kada otvorim neki datoteku sa 'fopen' i posaljem prvi string[100] koji ima 6B znakova + 2B(CR i LF) (i NULL je znak al' pretpostavit cemo da nije) i posaljem ga sa fputs, da li sada u datoteci su zauzeta 100B ili 8B? (to me zanima zbog brojanja bitova, a i zbog toga sto mozda u programu imam string kojem cu vise puta mjenjati vrijednosti znakova, pa bi onda jednom imao 8B a drugi put 88B, pa bi onda na disku ili bilo prvih 8B na onom mjestu gdje su bili, a drugih 80B poslije ovog treceg stringa ili se ovih 8B brišu koja su bila na prvom mjestu pa se trazi neka druga lokacija pa ce opet svi znakovi biti po redu u memoriji?)
Da li je onda taj file pointer onaj koji broji i koji ima neku trenutnu memoriju za brojač?
Da li on na pocetku prije nego sto je prenio i jedan znak ima vrijednost 0, a kada zavrsi prijenos prve linije teksta ima vrijednost 8?
Da li on onda kada ima vrijednost 8 opet odbroji tih 8B i krene na 9B (slovo 'n' u drugoj liniji)?

Zato sto string ne mora nuzno imati znakove za novi red u sebi. Kada koristis printf("\n") umjesto tog \n znaka printf ce staviti CR LF znakove...
Ako zelis da string u sebi ima i 100 znakova i jos znak za novi red, onda ces morati dodijeliti i mjesto za ta dva znaka. Ti uglavnom ne moras rucno ubacivati te razmake, dovoljno ti je da u printf dodas "\n", tako moras manje razbijati glavu s time.
Eh ovo je nesto drugo. Kada deklariras string[100] to samo znaci da si rezervirao mjesto u RAM-u za 100 znakova, ali ne mora nuzno znaciti i da koristis svih 100 znakova i da ce svih 100 biti ispisano. NULL oznacuje kraj stringa i znakovi poslije njega se ne ispisuju. Znaci ako pozoves fputs na stringu koji ima sveukupno 8 znakova pa onda NULL znak, ispisuje se tih 8 znakova bez obzira na to koliko ti znakova imao poslije znaka NULL. Postoji i funkcija koja ignorira NULL znak i ispisuje tocno onoliko koliko joj ti naredis (fwrite).
Ima, ali ta vrijednost nije namjenjena korisnicima za citanje.
Tocno tako, naravno, ako je ispisano 8 znakova u datoteku. Ako si ispisao 19 znakova onda ce mu vrijednost sa nule skociti na 19 i tako dalje...
Da.
Uglavnom, ti moras znati da on samo prati gdje si stao, ne moras sve citati ispocetka da bi dosao do neprocitanog djela, nego samo nastavljas dalje sa citanjem. Kada zatvoris datoteku sa fclose i taj brojac za tu datoteku se resetira na nulu i kad ju ponovno otvoris ide sve ispocetka.

Za ono prvo pitanje sam ja malo zabrijo, i \n red je znak, tak je to kad razmisljam. Al' evo sada probam u C-u deklarirat string od 10B i prilikom testiranja programa unesem 14 znakova i sa printf ispisujem string[13] i ispise ga normalno, kao da je produzio taj niz. Pak upisem 20 znakova, idem ispisati string[18], opet ga normalno ispise, ali prilikom zatvaranja programa izbaci windows onu gresku send/don't send.
Ok, znaci \n zauzima 2B, to sam naucio i sa File pointerom, koju jos namjenu ima.Sad znam. :) Hvala sto si izostavio sat - dva za ovo!

Za ono prvo pitanje sam ja malo zabrijo, i \n red je znak, tak je to kad razmisljam. Al' evo sada probam u C-u deklarirat string od 10B i prilikom testiranja programa unesem 14 znakova i sa printf ispisujem string[13] i ispise ga normalno, kao da je produzio taj niz.
Funkcija printf ispisuje sve dok ne dođe do nul-znaka - bio taj znak unutar polja znakova koje si joj poslao kao parametar ili negdje nakon.
Kad ti upišeš 14 znakova u polje veličine 10 bajtova, to polje (niz) nije produženo, nego si upisao znakove viša vjerojatno preko nekih drugih podataka u programu (ili ako imaš sreće, zapisani su u neku nekorištenu memoriju)!
To ispisivanje nikako nije normalno, iako se tebi čini. Da taj niz ne ispisuješ odmah, nego da ideš radit i druge stvari unutar programa, niz ti se možda nakon toga ne bi "normalno" ispisao, jer bi možda promijenile vrijednosti memorijskih lokacija na koje si "produžio" taj niz, kad te memorijske lokacije možebitno koriste druge varijable.
Dakle - iako ti se čini da to radi, to je pogrešno i prije ili kasnije bi mogao osjetiti posljedice. Već ih i jesi osjetio - sam si napisao da ti nekad izbaci grešku.
\n zauzima 2 bajta ako je u pitanju Windows program, no 1 bajt ako je u pitanju Linux program. No to je tebi nebitno, kad datoteku ne čitaš binarno, nego kao tekst. Stoga se sad nemoj opterećivati sa stvarima koje ti ne trebaju. Trebaš samo znati da je niz znakova terminiran nul-znakom (\0), a da je redak u tekstualnoj datoteci terminiran s \n (i to ti treba samo kod ispisa, ne i kod čitanja).

Samo da se nadovežem na mbaksu iako nisam pratio prethodnih par postova.
Osvrnut ću se na temu delimitera.
Kada znate da je rečenica gotova? Kada dođete do točke, uskličnika, upitnika. U tom kontekstu točka, uskličnik i upitnik su delimiteri. Isto tako u implementaciji funkcija u C-u se također koriste delimiteri. E sad od sustava do sustava se koriste različiti. Zato mbaksa govori o razlici između new line charactera Windowsa i Linuxa, konkretno Windows koristi dva bajta kao new line delimiter (0x13 i 0x10) dok Linux koristi samo (0x10).
Poanta moje priče je samo ta da te specijalne karaktere tipa (\n , \0 ...) ne gledate kao takve već kao bajtove koji služe da bi neka funkcija znala kada joj je kraj ili neki poseban događaj (novi red). Isto kao što EOF (koji je btw. macro) znači da je funkcija lupila o kraj file-a dok u stvarnosti to samo znači da je došla do bajta -1 tj. svih jedinica u binarnom obliku. Tako vi možete napisati svoju funkciju koja će za delimiter koristit slovo I. Ne postoje ograničenja. Zato samo želim da \n \0 EOF ne gledate kao neku logiku već samo kao jedan bajt kojega je lako handlat. Imam osjećaj da početnici mistificiraju te karaktere. :)
Nadam se da je itko uspio išta izvuć iz ovoga :)

1. uz pomoć while petlje riješi sljedeći zadatak: Napravi program koji računa zbroj do broja kojeg unese korisnik.
2. Napravi progrma koji računa zbroj svakog četvrtog broja do broja kojeg unese korisnik. Osim zbroja potrebno je ispisati i brojeve. Zadatak napiši uz pomoć for i do-while petlje....
ajde pomoć treba mi pomoć hitno... za ovoaj sat.. ili do 3. malom brzooo.... ovo nisam naučio a bitno mi je, u gužvi sam..

1. uz pomoć while petlje riješi sljedeći zadatak: Napravi program koji računa zbroj do broja kojeg unese korisnik.
2. Napravi progrma koji računa zbroj svakog četvrtog broja do broja kojeg unese korisnik. Osim zbroja potrebno je ispisati i brojeve. Zadatak napiši uz pomoć for i do-while petlje....
ajde pomoć treba mi pomoć hitno... za ovoaj sat.. ili do 3. malom brzooo.... ovo nisam naučio a bitno mi je, u gužvi sam..
Evo ti drugi, a prvi rijesi sâm (hint: moras doslovce promijeniti samo tri znaka)
#include <stdlib.h>
#include <stdio.h>
int main()
{
int broj, n=1, zbroj=0;
scanf("%d", &broj);
while (n<broj)
{
zbroj+=n;
n+=4;
}
return 0;
}

ajd pls i 1. treba mi za 5 min..

Ajme lijenosti.
umjesto n+=4 kucaj n++

ajd pls i 1. treba mi za 5 min..
a for i do while u 2???, a 1.? :(

Pa izmjeni while u do-while. A ako for petlju ne znas napisati...
Sto vi ucite po cijele dane?

ma nisam ništa ponavljo sve mi je u k. inace sam znao al mjeseci su to, al zašto ne radi kad ja napravim za 1.
#include <stdio.h>
int main()
{
int broj, n=1, zbroj=0;
printf ("Unesi broj: ");
scanf("%d", &broj);
while (n<broj)
{
zbroj+=n;
n++;
}
return 0;
}
napeto je al sam skonto.. ma printf ide, al hmm npr kad upišem 5 treba bit 15 a ne 10? za 1.
ugl, riješio 1. e sad drugi nemam ideju.. :S
#include <stdio.h>
#include <math.h>
int main()
{
int broj, n=1, zbroj=0;
printf ("Unesi broj: ");
scanf("%d", &broj);
while (n<=broj)
{
zbroj+=n;
n++;
}
printf ("%d", zbroj);
return 0;
}

1. uz pomoć while petlje riješi sljedeći zadatak: Napravi program koji računa zbroj do broja kojeg unese korisnik.
2. Napravi progrma koji računa zbroj svakog četvrtog broja do broja kojeg unese korisnik. Osim zbroja potrebno je ispisati i brojeve. Zadatak napiši uz pomoć for i do-while petlje....
ajde pomoć treba mi pomoć hitno... za ovoaj sat.. ili do 3. malom brzooo.... ovo nisam naučio a bitno mi je, u gužvi sam..
Evo ti drugi, a prvi rijesi sâm (hint: moras doslovce promijeniti samo tri znaka)
#include <stdlib.h>
#include <stdio.h>
int main()
{
int broj, n=1, zbroj=0;
scanf("%d", &broj);
while (n<broj)
{
zbroj+=n;
n+=4;
}
return 0;
}
Koliko sam shvatio zadatak mislim da treba u while petlji biti uvjet "while(n!=broj)" jer korisnik unosi sve brojeve koji su različiti od broja kojeg je uneso na početku,a ne manji!
Zanima me koja je oznaka odnosno specifikator za "unsigned long long int" tip podataka.
Možeš li objasniti što te zapravo zanima? Nije mi baš najjasnije. A inače, možeš si pogledati ovu stranicu.
A ono kad se najavljuju varijable u funkcijama printf i scanf.
Npr. int je: "%d", long int je: "%ld" itd.
Sad me zanima kako ide "unsigned long long int"
Sad je to sasvim druga priča. Imašovdje raspravu o tome. Pa pogledaj, isprobaj i javi što ti radi.