From 860c025165ef75889e02c3386dd48f8e7aec5895 Mon Sep 17 00:00:00 2001 From: Jack-Benny Persson Date: Fri, 1 Oct 2021 20:24:05 +0200 Subject: [PATCH] Initial commit --- README.md | 38 +++ c-prog-tredje-utg-framsida.png | Bin 0 -> 115529 bytes kapitel10/loopa-pekaradresser.c | 16 ++ kapitel10/pekararitmetik-ex1.c | 18 ++ kapitel10/pekararitmetik.c | 25 ++ kapitel10/pekare-ex1.c | 9 + kapitel10/pekare-ex2.c | 9 + kapitel10/pekare-till-falt.c | 10 + kapitel10/pekare-till-pekare-ex1.c | 15 ++ kapitel10/pekare-till-pekare-ex2.c | 36 +++ kapitel10/pekarvar-ex1.c | 22 ++ kapitel10/pekarvar-ex2.c | 15 ++ kapitel10/pekarvar.c | 23 ++ kapitel11/call-by-ref.c | 17 ++ kapitel11/falt-arg-ex1.c | 19 ++ kapitel11/falt-arg-ex2.c | 20 ++ kapitel11/mainarg.c | 12 + kapitel11/return-flt-ex1.c | 22 ++ kapitel11/return-flt-fail.c | 18 ++ kapitel11/simple-ls-ver1.c | 100 ++++++++ kapitel11/simple-ls-ver2.c | 75 ++++++ kapitel12/fildesc-ex1.c | 37 +++ kapitel12/fseek-ex1.c | 43 ++++ kapitel12/konfigfil.txt | 1 + kapitel12/lagerhantering-komplett.c | 360 +++++++++++++++++++++++++++ kapitel12/las-flera-flt.c | 23 ++ kapitel12/las-flt-fil-ex1.c | 25 ++ kapitel12/las-flt-fil.c | 18 ++ kapitel12/lasa-bin-ex1.c | 16 ++ kapitel12/lasa-fil-ex1.c | 14 ++ kapitel12/lasa-fil-ex2.c | 32 +++ kapitel12/lasa-fil-ex3-c99.c | 33 +++ kapitel12/lasa-fil-ex3.c | 32 +++ kapitel12/lasa-matt.c | 27 ++ kapitel12/lasa-person-struct.c | 38 +++ kapitel12/skriv-bin-ex1.c | 20 ++ kapitel12/skriv-fil-ex1.c | 18 ++ kapitel12/skriv-flera-flt.c | 18 ++ kapitel12/skriv-flt-fil.c | 15 ++ kapitel12/skriv-person-struct.c | 42 ++++ kapitel13/filinfo-portabel.c | 39 +++ kapitel13/filinfo.c | 25 ++ kapitel13/mychown-felhantering-ex1.c | 42 ++++ kapitel13/mychown-felhantering-ex2.c | 30 +++ kapitel13/mychown-felhantering-ex3.c | 27 ++ kapitel13/mychown.c | 27 ++ kapitel13/mytouch.c | 22 ++ kapitel13/write-ex1.c | 8 + kapitel13/write-ex2.c | 8 + kapitel14/fahr-felhantering.c | 40 +++ kapitel14/fahr.c | 15 ++ kapitel14/miljovar-ex1.c | 29 +++ kapitel14/miljovar-ex2.c | 11 + kapitel14/outerrtest.c | 8 + kapitel14/temps.txt | 5 + kapitel14/testtmp.txt | 10 + kapitel15/exempel.c | 11 + kapitel15/funk.c | 4 + kapitel15/funk.h | 1 + kapitel15/jbmath/jbmath.c | 10 + kapitel15/jbmath/jbmath.h | 3 + kapitel15/jbmath/jbpow.c | 10 + kapitel15/jbmath/usemath-dyn.c | 12 + kapitel15/jbmath/usemath.c | 12 + kapitel15/matte/Makefile | 17 ++ kapitel15/matte/matte.c | 34 +++ kapitel15/matte/minmattefunk.c | 9 + kapitel15/matte/minmattefunk.h | 2 + kapitel15/matte/usage.c | 8 + kapitel15/matte/usage.h | 1 + kapitel15/matte/version2.Makefile | 10 + kapitel15/matte/version3.Makefile | 11 + kapitel15/matte/version4.Makefile | 18 ++ kapitel15/prog.c | 7 + kapitel16/daemon-ex1.c | 66 +++++ kapitel16/execldemo.c | 12 + kapitel16/forkdemo-ex2.c | 29 +++ kapitel16/forkdemo.c | 25 ++ kapitel16/systest.c | 9 + kapitel16/zombie.c | 28 +++ kapitel17/daemon-ex2.c | 108 ++++++++ kapitel17/daemon-sig-ex1.c | 106 ++++++++ kapitel17/daemon-sig-ex2.c | 125 ++++++++++ kapitel17/fifo-client-ex1.c | 20 ++ kapitel17/fifo-ex1.c | 79 ++++++ kapitel17/my-msg-recv.c | 45 ++++ kapitel17/my-msg-send.c | 53 ++++ kapitel17/pipes-ex1.c | 27 ++ kapitel17/sig-client.c | 61 +++++ kapitel17/unix-socket-client.c | 48 ++++ kapitel17/unix-socket-server.c | 87 +++++++ kapitel18/mygetip.c | 61 +++++ kapitel18/tcp-client.c | 91 +++++++ kapitel18/tcp-server.c | 113 +++++++++ kapitel18/udp-client.c | 85 +++++++ kapitel18/udp-server.c | 90 +++++++ kapitel19/felsok-ex1.c | 17 ++ kapitel19/felsok-ex2.c | 25 ++ kapitel19/flt-fel1.c | 23 ++ kapitel19/leak1.c | 14 ++ kapitel19/oinitialiserat-ex1.c | 11 + kapitel19/undersoka-minne.c | 17 ++ kapitel4/helloworld.c | 7 + kapitel4/namn.c | 10 + kapitel4/namn_unsafe.c | 10 + kapitel4/namn_v2.c | 10 + kapitel4/namn_v3.c | 13 + kapitel4/testa-strcspn.c | 11 + kapitel5/agg.c | 9 + kapitel5/aritmetik-cast1.c | 8 + kapitel5/aritmetik-cast2.c | 9 + kapitel5/aritmetik1.c | 20 ++ kapitel5/aritmetik2.c | 8 + kapitel5/bytes.c | 10 + kapitel5/bytes_cast.c | 14 ++ kapitel5/bytes_zu.c | 10 + kapitel5/casting-ex1.c | 22 ++ kapitel5/charint.c | 14 ++ kapitel5/const-int.c | 9 + kapitel5/flt.c | 9 + kapitel5/fmodtest.c | 11 + kapitel5/if-else-ex1.c | 27 ++ kapitel5/int-falt.c | 15 ++ kapitel5/konstant-tal.c | 10 + kapitel5/konstanter.c | 11 + kapitel5/lager_v1.c | 24 ++ kapitel5/lager_v2.c | 38 +++ kapitel5/lager_v3.c | 38 +++ kapitel5/matematik-parenteser.c | 9 + kapitel5/max_int.c | 9 + kapitel5/modulo-ex1.c | 12 + kapitel5/struct-test.c | 28 +++ kapitel5/type-demo.c | 27 ++ kapitel5/uniontest.c | 23 ++ kapitel5/uniontest_v2.c | 25 ++ kapitel5/unsignedtest.c | 13 + kapitel5/veckodagar.c | 20 ++ kapitel6/break-ex1.c | 15 ++ kapitel6/break-ex2.c | 21 ++ kapitel6/break-ex3.c | 14 ++ kapitel6/c99-for-loop.c | 20 ++ kapitel6/cmp-strings.c | 21 ++ kapitel6/continue-ex1.c | 13 + kapitel6/do-while-ex1.c | 14 ++ kapitel6/elseif-ex1.c | 21 ++ kapitel6/elseif-ex2.c | 15 ++ kapitel6/enkelt-losenord.c | 16 ++ kapitel6/for-uteslut-ex1.c | 13 + kapitel6/if-ex1.c | 13 + kapitel6/if-ex2.c | 11 + kapitel6/if-ex3.c | 8 + kapitel6/logiskt.c | 17 ++ kapitel6/oandlig-loop.c | 10 + kapitel6/rakna-upp.c | 13 + kapitel6/tecken.c | 12 + kapitel6/tecken_v2.c | 26 ++ kapitel6/tecken_v3.c | 22 ++ kapitel6/veckodag.c | 41 +++ kapitel6/while-ex1.c | 13 + kapitel6/while-ex2.c | 14 ++ kapitel7/bitvis-negation-ex1.c | 13 + kapitel7/bitvis-negation-signerad.c | 9 + kapitel7/bitvis-skift-ex1.c | 17 ++ kapitel7/bitwise-and-or-ex1.c | 16 ++ kapitel7/bitwise-and-or-ex2.c | 14 ++ kapitel7/bitwise-and-or-ex3.c | 11 + kapitel7/bitwise-and-or-ex4.c | 13 + kapitel7/exklusiv-eller.c | 13 + kapitel8/arsiffra.c | 18 ++ kapitel8/arsiffra_v2.c | 22 ++ kapitel8/callbyvalue.c | 18 ++ kapitel8/digit-test.c | 11 + kapitel8/omkrets.c | 18 ++ kapitel8/primtal.c | 26 ++ kapitel8/primtalsprogram.c | 34 +++ kapitel8/skrivprm.c | 22 ++ kapitel8/skrivprm.h | 1 + kapitel9/block-scope-ex1.c | 27 ++ kapitel9/block-scope-ex2.c | 20 ++ kapitel9/calloc-ex1.c | 20 ++ kapitel9/forsta-tecknet.c | 30 +++ kapitel9/fungerande-scope-fil1.c | 9 + kapitel9/fungerande-scope-fil2.c | 2 + kapitel9/global-ex1.c | 19 ++ kapitel9/global-ex2.c | 10 + kapitel9/icke-fungerande-scope.c | 15 ++ kapitel9/med-initialisering.c | 22 ++ kapitel9/memset-ex1.c | 15 ++ kapitel9/minneshantering-ex1.c | 24 ++ kapitel9/static-ex1.c | 18 ++ kapitel9/static-ex2.c | 18 ++ kapitel9/strncpy-ex1.c | 15 ++ kapitel9/testar-array.c | 28 +++ kapitel9/utan-initialisering.c | 20 ++ 194 files changed, 4846 insertions(+) create mode 100644 README.md create mode 100755 c-prog-tredje-utg-framsida.png create mode 100644 kapitel10/loopa-pekaradresser.c create mode 100644 kapitel10/pekararitmetik-ex1.c create mode 100644 kapitel10/pekararitmetik.c create mode 100644 kapitel10/pekare-ex1.c create mode 100644 kapitel10/pekare-ex2.c create mode 100644 kapitel10/pekare-till-falt.c create mode 100644 kapitel10/pekare-till-pekare-ex1.c create mode 100644 kapitel10/pekare-till-pekare-ex2.c create mode 100644 kapitel10/pekarvar-ex1.c create mode 100644 kapitel10/pekarvar-ex2.c create mode 100644 kapitel10/pekarvar.c create mode 100644 kapitel11/call-by-ref.c create mode 100644 kapitel11/falt-arg-ex1.c create mode 100644 kapitel11/falt-arg-ex2.c create mode 100644 kapitel11/mainarg.c create mode 100644 kapitel11/return-flt-ex1.c create mode 100644 kapitel11/return-flt-fail.c create mode 100644 kapitel11/simple-ls-ver1.c create mode 100644 kapitel11/simple-ls-ver2.c create mode 100644 kapitel12/fildesc-ex1.c create mode 100644 kapitel12/fseek-ex1.c create mode 100644 kapitel12/konfigfil.txt create mode 100644 kapitel12/lagerhantering-komplett.c create mode 100644 kapitel12/las-flera-flt.c create mode 100644 kapitel12/las-flt-fil-ex1.c create mode 100644 kapitel12/las-flt-fil.c create mode 100644 kapitel12/lasa-bin-ex1.c create mode 100644 kapitel12/lasa-fil-ex1.c create mode 100644 kapitel12/lasa-fil-ex2.c create mode 100644 kapitel12/lasa-fil-ex3-c99.c create mode 100644 kapitel12/lasa-fil-ex3.c create mode 100644 kapitel12/lasa-matt.c create mode 100644 kapitel12/lasa-person-struct.c create mode 100644 kapitel12/skriv-bin-ex1.c create mode 100644 kapitel12/skriv-fil-ex1.c create mode 100644 kapitel12/skriv-flera-flt.c create mode 100644 kapitel12/skriv-flt-fil.c create mode 100644 kapitel12/skriv-person-struct.c create mode 100644 kapitel13/filinfo-portabel.c create mode 100644 kapitel13/filinfo.c create mode 100644 kapitel13/mychown-felhantering-ex1.c create mode 100644 kapitel13/mychown-felhantering-ex2.c create mode 100644 kapitel13/mychown-felhantering-ex3.c create mode 100644 kapitel13/mychown.c create mode 100644 kapitel13/mytouch.c create mode 100644 kapitel13/write-ex1.c create mode 100644 kapitel13/write-ex2.c create mode 100644 kapitel14/fahr-felhantering.c create mode 100644 kapitel14/fahr.c create mode 100644 kapitel14/miljovar-ex1.c create mode 100644 kapitel14/miljovar-ex2.c create mode 100644 kapitel14/outerrtest.c create mode 100644 kapitel14/temps.txt create mode 100644 kapitel14/testtmp.txt create mode 100644 kapitel15/exempel.c create mode 100644 kapitel15/funk.c create mode 100644 kapitel15/funk.h create mode 100644 kapitel15/jbmath/jbmath.c create mode 100644 kapitel15/jbmath/jbmath.h create mode 100644 kapitel15/jbmath/jbpow.c create mode 100644 kapitel15/jbmath/usemath-dyn.c create mode 100644 kapitel15/jbmath/usemath.c create mode 100644 kapitel15/matte/Makefile create mode 100644 kapitel15/matte/matte.c create mode 100644 kapitel15/matte/minmattefunk.c create mode 100644 kapitel15/matte/minmattefunk.h create mode 100644 kapitel15/matte/usage.c create mode 100644 kapitel15/matte/usage.h create mode 100644 kapitel15/matte/version2.Makefile create mode 100644 kapitel15/matte/version3.Makefile create mode 100644 kapitel15/matte/version4.Makefile create mode 100644 kapitel15/prog.c create mode 100644 kapitel16/daemon-ex1.c create mode 100644 kapitel16/execldemo.c create mode 100644 kapitel16/forkdemo-ex2.c create mode 100644 kapitel16/forkdemo.c create mode 100644 kapitel16/systest.c create mode 100644 kapitel16/zombie.c create mode 100644 kapitel17/daemon-ex2.c create mode 100644 kapitel17/daemon-sig-ex1.c create mode 100644 kapitel17/daemon-sig-ex2.c create mode 100644 kapitel17/fifo-client-ex1.c create mode 100644 kapitel17/fifo-ex1.c create mode 100644 kapitel17/my-msg-recv.c create mode 100644 kapitel17/my-msg-send.c create mode 100644 kapitel17/pipes-ex1.c create mode 100644 kapitel17/sig-client.c create mode 100644 kapitel17/unix-socket-client.c create mode 100644 kapitel17/unix-socket-server.c create mode 100644 kapitel18/mygetip.c create mode 100644 kapitel18/tcp-client.c create mode 100644 kapitel18/tcp-server.c create mode 100644 kapitel18/udp-client.c create mode 100644 kapitel18/udp-server.c create mode 100644 kapitel19/felsok-ex1.c create mode 100644 kapitel19/felsok-ex2.c create mode 100644 kapitel19/flt-fel1.c create mode 100644 kapitel19/leak1.c create mode 100644 kapitel19/oinitialiserat-ex1.c create mode 100644 kapitel19/undersoka-minne.c create mode 100644 kapitel4/helloworld.c create mode 100644 kapitel4/namn.c create mode 100644 kapitel4/namn_unsafe.c create mode 100644 kapitel4/namn_v2.c create mode 100644 kapitel4/namn_v3.c create mode 100644 kapitel4/testa-strcspn.c create mode 100644 kapitel5/agg.c create mode 100644 kapitel5/aritmetik-cast1.c create mode 100644 kapitel5/aritmetik-cast2.c create mode 100644 kapitel5/aritmetik1.c create mode 100644 kapitel5/aritmetik2.c create mode 100644 kapitel5/bytes.c create mode 100644 kapitel5/bytes_cast.c create mode 100644 kapitel5/bytes_zu.c create mode 100644 kapitel5/casting-ex1.c create mode 100644 kapitel5/charint.c create mode 100644 kapitel5/const-int.c create mode 100644 kapitel5/flt.c create mode 100644 kapitel5/fmodtest.c create mode 100644 kapitel5/if-else-ex1.c create mode 100644 kapitel5/int-falt.c create mode 100644 kapitel5/konstant-tal.c create mode 100644 kapitel5/konstanter.c create mode 100644 kapitel5/lager_v1.c create mode 100644 kapitel5/lager_v2.c create mode 100644 kapitel5/lager_v3.c create mode 100644 kapitel5/matematik-parenteser.c create mode 100644 kapitel5/max_int.c create mode 100644 kapitel5/modulo-ex1.c create mode 100644 kapitel5/struct-test.c create mode 100644 kapitel5/type-demo.c create mode 100644 kapitel5/uniontest.c create mode 100644 kapitel5/uniontest_v2.c create mode 100644 kapitel5/unsignedtest.c create mode 100644 kapitel5/veckodagar.c create mode 100644 kapitel6/break-ex1.c create mode 100644 kapitel6/break-ex2.c create mode 100644 kapitel6/break-ex3.c create mode 100644 kapitel6/c99-for-loop.c create mode 100644 kapitel6/cmp-strings.c create mode 100644 kapitel6/continue-ex1.c create mode 100644 kapitel6/do-while-ex1.c create mode 100644 kapitel6/elseif-ex1.c create mode 100644 kapitel6/elseif-ex2.c create mode 100644 kapitel6/enkelt-losenord.c create mode 100644 kapitel6/for-uteslut-ex1.c create mode 100644 kapitel6/if-ex1.c create mode 100644 kapitel6/if-ex2.c create mode 100644 kapitel6/if-ex3.c create mode 100644 kapitel6/logiskt.c create mode 100644 kapitel6/oandlig-loop.c create mode 100644 kapitel6/rakna-upp.c create mode 100644 kapitel6/tecken.c create mode 100644 kapitel6/tecken_v2.c create mode 100644 kapitel6/tecken_v3.c create mode 100644 kapitel6/veckodag.c create mode 100644 kapitel6/while-ex1.c create mode 100644 kapitel6/while-ex2.c create mode 100644 kapitel7/bitvis-negation-ex1.c create mode 100644 kapitel7/bitvis-negation-signerad.c create mode 100644 kapitel7/bitvis-skift-ex1.c create mode 100644 kapitel7/bitwise-and-or-ex1.c create mode 100644 kapitel7/bitwise-and-or-ex2.c create mode 100644 kapitel7/bitwise-and-or-ex3.c create mode 100644 kapitel7/bitwise-and-or-ex4.c create mode 100644 kapitel7/exklusiv-eller.c create mode 100644 kapitel8/arsiffra.c create mode 100644 kapitel8/arsiffra_v2.c create mode 100644 kapitel8/callbyvalue.c create mode 100644 kapitel8/digit-test.c create mode 100644 kapitel8/omkrets.c create mode 100644 kapitel8/primtal.c create mode 100644 kapitel8/primtalsprogram.c create mode 100644 kapitel8/skrivprm.c create mode 100644 kapitel8/skrivprm.h create mode 100644 kapitel9/block-scope-ex1.c create mode 100644 kapitel9/block-scope-ex2.c create mode 100644 kapitel9/calloc-ex1.c create mode 100644 kapitel9/forsta-tecknet.c create mode 100644 kapitel9/fungerande-scope-fil1.c create mode 100644 kapitel9/fungerande-scope-fil2.c create mode 100644 kapitel9/global-ex1.c create mode 100644 kapitel9/global-ex2.c create mode 100644 kapitel9/icke-fungerande-scope.c create mode 100644 kapitel9/med-initialisering.c create mode 100644 kapitel9/memset-ex1.c create mode 100644 kapitel9/minneshantering-ex1.c create mode 100644 kapitel9/static-ex1.c create mode 100644 kapitel9/static-ex2.c create mode 100644 kapitel9/strncpy-ex1.c create mode 100644 kapitel9/testar-array.c create mode 100644 kapitel9/utan-initialisering.c diff --git a/README.md b/README.md new file mode 100644 index 0000000..c5d2809 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# C-programmering i Linux, macOS, BSD och Solaris (tredje utgåvan) +Här finns du all exempelkod för tredje utgåvan av boken *C-programmering i +Linux, macOS, BSD och Solaris* (ISBN: 978-91-983300-7-6). + +Boken går att köpa från [CyberInfo Sverige](https://www.cyberinfo.se/bocker/), +[Bokus](https://www.bokus.com/cgi-bin/product_search.cgi?publisher=CyberInfo%20Sverige) +och +[Adlibris](https://www.adlibris.com/se/sok?filter=publisher%3ACyberInfo%20Sverige) +från och med hösten/vintern 2021. + +Är du nyfiken på boken så titta gärna i [innehållsförteckningen](https://www.cyberinfo.se/dokument/c-prog_innehallsforteckning_3e_utg.html). + +## Baksidetexten +**C-programmering i Linux, macOS, BSD och Solaris** lär först ut grunderna i +C-programmering så att vi har en stabil grund att stå på. Denna del vänder sig +mot de som är nya på C-programmering eller för de som behöver fräscha upp sina +C-kunskaper. Därefter börjar vi att programmera alltmer mot Unixsystem med +hjälp av bland annat systemanrop. Vi lär oss att skapa och använda demoner, +standard input- och output, filrättigheter, FIFO, processhantering, make-filer, +meddelandeköer med mera. Vi får också lära oss hur man kopplar samman flera +program med hjälp av rörledningar och skalskript. Mot slutet av boken tittar vi +på hur man använder felsökningsverktyg som GDB, LLDB och Valgrind. + +Grundtanken med boken är att du som läsare bara ska behöva en enda bok för att +komma igång att utveckla program och verktyg för Unixsystem. Boken är uppbyggd +på devisen att lära genom exempel. I boken finns över 180 exempelprogram, både +stora och små. Efter varje kapitel finns dessutom övningsuppgifter, så att du +som läsare ska kunna arbeta med boken på egen hand. + +I denna tredje utgåva har stora delar skrivits om för att göra boken mer +lättläst, relevant och uppdaterad. Bland annat har kapitlet om IPC utökats till +att även innefatta Unix-sockets. Ett helt kapitel om TCP/IP-programmering har +också lagts till. En del förbättringar har också gjorts av exempelprogrammen i +boken. + +## Framsida +![C-programmering i Linux, macOS, BSD och +Solaris](c-prog-tredje-utg-framsida.png) diff --git a/c-prog-tredje-utg-framsida.png b/c-prog-tredje-utg-framsida.png new file mode 100755 index 0000000000000000000000000000000000000000..d0335824071970890c18df3a7c620c173a4aa1c0 GIT binary patch literal 115529 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 S$0Xq3C_mFsD2Bay|9=4Svl_Pm literal 0 HcmV?d00001 diff --git a/kapitel10/loopa-pekaradresser.c b/kapitel10/loopa-pekaradresser.c new file mode 100644 index 0000000..514623b --- /dev/null +++ b/kapitel10/loopa-pekaradresser.c @@ -0,0 +1,16 @@ +#include +#define SIZE 11 + +int main(void) +{ + int i; + char namn[SIZE] = "Jack-Benny"; + printf("Adressen till 'namn': %p\n", (void*)&namn); + + for (i=0; i %p\n", i, (void*)&namn[i]); + } + + return 0; +} diff --git a/kapitel10/pekararitmetik-ex1.c b/kapitel10/pekararitmetik-ex1.c new file mode 100644 index 0000000..39f6970 --- /dev/null +++ b/kapitel10/pekararitmetik-ex1.c @@ -0,0 +1,18 @@ +#include +#define LANGD 5 + +int main(void) +{ + int i; + int x[LANGD] = {0, 1, 2, 3, 4}; + int *px; + + px = x; + + for (i = 0; i + +int main(void) +{ + int i; + char fnamn[] = "Jack-Benny"; + char *enamn = "Persson"; + + printf("Förnamn: %s\n", fnamn); + printf("Efternamn: %s\n\n", enamn); + + printf("Förnamn: %p %p\n", (void*)&fnamn, (void*)fnamn); + printf("Efternamn: %p %p\n", (void*)&enamn, (void*)enamn); + + /* Skriv ut ett tecken i taget med mellanslag mellan varje + tecken. Detta görs genom att addera 1 till pekarvariabeln + för varje iteration */ + for (i=0; i<=7; i++) + { + printf("%c ", *enamn); + enamn = enamn + 1; + } + printf("\n"); + return 0; +} diff --git a/kapitel10/pekare-ex1.c b/kapitel10/pekare-ex1.c new file mode 100644 index 0000000..89e8836 --- /dev/null +++ b/kapitel10/pekare-ex1.c @@ -0,0 +1,9 @@ +#include + +int main(void) +{ + float pi = 3.14159; + printf("Adressen till 'pi' är: %lu\n", &pi); + + return 0; +} diff --git a/kapitel10/pekare-ex2.c b/kapitel10/pekare-ex2.c new file mode 100644 index 0000000..5dfd2cf --- /dev/null +++ b/kapitel10/pekare-ex2.c @@ -0,0 +1,9 @@ +#include + +int main(void) +{ + float pi = 3.14159; + printf("Adressen till 'pi' är: %p\n", (void*)&pi); + + return 0; +} diff --git a/kapitel10/pekare-till-falt.c b/kapitel10/pekare-till-falt.c new file mode 100644 index 0000000..7a657af --- /dev/null +++ b/kapitel10/pekare-till-falt.c @@ -0,0 +1,10 @@ +#include +#define SIZE 11 + +int main(void) +{ + char namn[SIZE] = "Jack-Benny"; + printf("Adressen till 'namn': %p\n", (void*)&namn); + + return 0; +} diff --git a/kapitel10/pekare-till-pekare-ex1.c b/kapitel10/pekare-till-pekare-ex1.c new file mode 100644 index 0000000..10b0c3b --- /dev/null +++ b/kapitel10/pekare-till-pekare-ex1.c @@ -0,0 +1,15 @@ +#include + +int main(void) +{ + int x = 5; + int *px; + int **ppx; + + px = &x; + ppx = &px; + + printf("%d\n", **ppx); + + return 0; +} diff --git a/kapitel10/pekare-till-pekare-ex2.c b/kapitel10/pekare-till-pekare-ex2.c new file mode 100644 index 0000000..85fd3ad --- /dev/null +++ b/kapitel10/pekare-till-pekare-ex2.c @@ -0,0 +1,36 @@ +#include +#define LANGD 3 + +int main(void) +{ + int i; + char *ord[LANGD]; + char *pc; + char **ppc; + + ord[0] = "hund"; + ord[1] = "katt"; + ord[2] = "kanin"; + + /* Skriv ut de tre strängarna */ + for (i = 0; i < LANGD; i++) + { + printf("%s\n", ord[i]); + } + printf("\n"); + + /* Skriv ut tecken för tecken */ + for (i = 0; i < LANGD; i++) + { + ppc = ord + i; + pc = *ppc; + while (*pc != '\0') + { + printf("%c ", *pc); + pc = pc + 1; + } + printf("\n"); + } + + return 0; +} diff --git a/kapitel10/pekarvar-ex1.c b/kapitel10/pekarvar-ex1.c new file mode 100644 index 0000000..bf64bbf --- /dev/null +++ b/kapitel10/pekarvar-ex1.c @@ -0,0 +1,22 @@ +#include + +int main(void) +{ + /* Skapa vanliga variabler & fält */ + float pi = 3.14159; + + /* Deklarera pekarna */ + float *ppi; + + /* Sätt pekaren till adressen av variabeln */ + ppi = π + + /* Skriv ut det som pekaren pekar på och dess innehåll */ + printf("Adressen till 'pi': %p\n", (void*)&pi); + printf("'pi' innehåller: %.5f\n\n", pi); + printf("Adressen till 'ppi': %p\n", (void*)&ppi); + printf("'ppi' pekar på värdet: %.5f\n", *ppi); + printf("'ppi' innehåller: %p\n", (void*)ppi); + + return 0; +} diff --git a/kapitel10/pekarvar-ex2.c b/kapitel10/pekarvar-ex2.c new file mode 100644 index 0000000..bb693d5 --- /dev/null +++ b/kapitel10/pekarvar-ex2.c @@ -0,0 +1,15 @@ +#include + +int main(void) +{ + char fnamn[] = "Jack-Benny"; + char *enamn = "Persson"; + + printf("Förnamn: %s\n", fnamn); + printf("Efternamn: %s\n\n", enamn); + + printf("Förnamn: %p %p\n", (void*)&fnamn, (void*)fnamn); + printf("Efternamn: %p %p\n", (void*)&enamn, (void*)enamn); + + return 0; +} diff --git a/kapitel10/pekarvar.c b/kapitel10/pekarvar.c new file mode 100644 index 0000000..667c778 --- /dev/null +++ b/kapitel10/pekarvar.c @@ -0,0 +1,23 @@ +#include +#define SIZE 11 + +int main(void) +{ + /* Skapa vanliga variabler & fält */ + float pi = 3.14159; + char namn[SIZE] = "Jack-Benny"; + + /* Deklarera pekarna */ + float *ppi; + char *pnamn; + + /* Sätt pekarna till adressen av variablerna */ + ppi = π + pnamn = &namn[5]; + + /* Skriv ut det som pekarna pekar på */ + printf("Pi = %.5f\n", *ppi); + printf("Namn = %s\n", pnamn); + + return 0; +} diff --git a/kapitel11/call-by-ref.c b/kapitel11/call-by-ref.c new file mode 100644 index 0000000..5dd6555 --- /dev/null +++ b/kapitel11/call-by-ref.c @@ -0,0 +1,17 @@ +#include + +void inc(int *tal); + +int main(void) +{ + int x = 5; + printf("x är nu: %d\n", x); + inc(&x); + printf("x är nu: %d\n", x); + return 0; +} + +void inc(int *tal) +{ + *tal = *tal + 3; +} diff --git a/kapitel11/falt-arg-ex1.c b/kapitel11/falt-arg-ex1.c new file mode 100644 index 0000000..795dfb9 --- /dev/null +++ b/kapitel11/falt-arg-ex1.c @@ -0,0 +1,19 @@ +#include + +void say(char *namn); + +int main(void) +{ + char namn01[] = "Kalle"; + char *namn02 = "Lisa"; + + say(namn01); + say(namn02); + say("Jack-Benny"); + return 0; +} + +void say(char *namn) +{ + printf("Hej %s, hur är läget?\n", namn); +} diff --git a/kapitel11/falt-arg-ex2.c b/kapitel11/falt-arg-ex2.c new file mode 100644 index 0000000..132ef21 --- /dev/null +++ b/kapitel11/falt-arg-ex2.c @@ -0,0 +1,20 @@ +#include + +float medel(int tal[], int antal); + +int main(void) +{ + int x[] = {40, 42, 39, 37, 28}; + printf("Medelvärdet är: %.1f\n", medel(x, 5)); + return 0; +} + +float medel(int tal[], int antal) +{ + int i; + int sum = 0; + for (i = 0; i + +int main(int argc, char **argv) +{ + int i; + printf("Du har angett %d st argument\n", argc); + for (i = 0; i +#include +#include + +char *say(char namn[]); + +int main(void) +{ + char *mening = say("Jack-Benny"); + printf("%s\n", mening); + free(mening); + return 0; +} + +char *say(char namn[]) +{ + char *str; + str = calloc(50, sizeof(char)); + strncat(str, "Hej ", 4); + strncat(str, namn, 45); + return str; +} diff --git a/kapitel11/return-flt-fail.c b/kapitel11/return-flt-fail.c new file mode 100644 index 0000000..2d588bf --- /dev/null +++ b/kapitel11/return-flt-fail.c @@ -0,0 +1,18 @@ +#include +#include + +char *say(char namn[]); + +int main(void) +{ + printf("%s\n", say("Jack-Benny")); + return 0; +} + +char *say(char namn[]) +{ + char str[50] = { 0 }; + strncat(str, "Hej ", 4); + strncat(str, namn, 45); + return str; +} diff --git a/kapitel11/simple-ls-ver1.c b/kapitel11/simple-ls-ver1.c new file mode 100644 index 0000000..ae36b08 --- /dev/null +++ b/kapitel11/simple-ls-ver1.c @@ -0,0 +1,100 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include + +void printUsage(char *arg); + +int main(int argc, char **argv) +{ + unsigned int typ; + char opt[4] = { 0 }; + + /* Skapa pekare och struct */ + DIR *d; + struct dirent *dir; + struct stat s; + + /* Läs in aktuell katalog */ + d = opendir("."); + /* Om 'd' INTE är sant (! = inte sant) */ + if (!d) + { + printf("Kan inte läsa aktuell katalog\n"); + return 1; + } + + /* Behandla arugment */ + if (argc == 1) + { + strncpy(opt, "-a", 3); + } + else if (argc == 2) + { + strncpy(opt, argv[1], 3); + + /* Hjälptext */ + if ( strcmp(opt, "-h") == 0 ) + printUsage(argv[0]); + + /* Visa endast filer */ + else if ( strcmp(opt, "-f") == 0 ) + { + typ = S_IFREG; + } + + /* Visa endast kataloger */ + else if ( strcmp(opt, "-d") == 0 ) + { + typ = S_IFDIR; + } + + /* Visa alla filer */ + else if ( strcmp(opt, "-a") == 0 ) + { + ; + } + + /* Om vi angav ett felaktigt argument */ + else + { + printUsage(argv[0]); + return 1; + } + } + /* Om vi angav fel antal argument */ + else + { + printUsage(argv[0]); + return 1; + } + + /* Skriv ut innehållet i katalogen */ + while ((dir = readdir(d)) != NULL) + { + if ( strcmp(opt, "-a") == 0 ) + { + printf("%s\n", dir->d_name); + } + else + { + stat(dir->d_name, &s); + /* Se kapitlet om 'Bitvisa operationer' */ + if ((s.st_mode & S_IFMT) == typ) + printf("%s\n", dir->d_name); + } + } + + /* Stäng "d" och returnera noll */ + closedir(d); + return 0; +} + +void printUsage(char *arg) +{ + printf("Usage: %s [-a] [-f] [-d]\n" + " -a to list all types (default)\n" + " -f to list only files\n" + " -d to list only directories\n", arg); +} diff --git a/kapitel11/simple-ls-ver2.c b/kapitel11/simple-ls-ver2.c new file mode 100644 index 0000000..5a031ab --- /dev/null +++ b/kapitel11/simple-ls-ver2.c @@ -0,0 +1,75 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include + +void printUsage(char *arg); + +int main(int argc, char **argv) +{ + int opt; + unsigned int typ = 0; + char *path = "."; + + /* Skapa pekare och struct */ + DIR *d; + struct dirent *dir; + struct stat s; + + /* Behandla argument med getopt */ + while ((opt = getopt(argc, argv, "hafdp:")) != -1) + { + switch (opt) + { + case 'a': + typ = -1; + break; + case 'f': + typ = S_IFREG; + break; + case 'd': + typ = S_IFDIR; + break; + case 'p': + path = optarg; + break; + case 'h': + printUsage(argv[0]); + return 0; + default: + printUsage(argv[0]); + return 1; + } + } + + /* Byt katalog med chdir() för att stat() ska + se filerna i rätt katalog */ + chdir(path); + + d = opendir(path); + while ((dir = readdir(d)) != NULL) + { + if ( typ == 0 ) + { + printf("%s\n", dir->d_name); + } + else + { + stat(dir->d_name, &s); + /* Se kapitlet om 'Bitvisa operationer' */ + if ((s.st_mode & S_IFMT) == typ) + printf("%s\n", dir->d_name); + } + } + return 0; +} + +void printUsage(char *arg) +{ + printf("Usage: %s [-a] [-f] [-d] [-p path]\n" + " -a to list all types (default)\n" + " -f to list only files\n" + " -d to list only directories\n" + " -p to specify a directory\n", arg); +} diff --git a/kapitel12/fildesc-ex1.c b/kapitel12/fildesc-ex1.c new file mode 100644 index 0000000..79a79d8 --- /dev/null +++ b/kapitel12/fildesc-ex1.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include + +int main(void) +{ + int fd; + int readstat; + off_t filesize; + struct stat fileinfo; + char wbuf[] = "Hejsan svejsan\n"; + char rbuf[50]; + + /* Öppna filen "minfil" i läs- och skrivläge (O_RDWR). + Skapa den om den inte redan finns (O_CREAT) + Sätt filrättigheterna till 00644*/ + fd = open("minfil", O_CREAT|O_RDWR, 00644); + write(fd, wbuf, sizeof(wbuf)); /* Skriv wbuf till filen */ + + /* Här börjar vi läsa in filen igen */ + fstat(fd, &fileinfo); + filesize = fileinfo.st_size; + printf("Storlek: %ld\n", (long int)filesize); + /* Återställ markören till byte 0 med lseek */ + lseek(fd, 0, SEEK_SET); + readstat = read(fd, rbuf, filesize); /* Läs innehållet till rbuf */ + rbuf[fileinfo.st_size+1] = '\0'; /* Avsluta med NULL */ + + /* Skriv ut information och filens innehåll */ + printf("Fildeskriptorns nummer: %d\n", fd); + printf("Returvärde från 'read': %d\n", readstat); + printf("Inläst text: %s\n", rbuf); + + return 0; +} diff --git a/kapitel12/fseek-ex1.c b/kapitel12/fseek-ex1.c new file mode 100644 index 0000000..6c03bae --- /dev/null +++ b/kapitel12/fseek-ex1.c @@ -0,0 +1,43 @@ +#include + +int main(void) +{ + int langd, bredd, hojd; + signed char ch; + int i; + FILE *fp; + + /* Kontrollera först om filen finns och om inte + avsluta programmet och skriv ett felmeddelande */ + if ( (fp = fopen("konfigfil.txt", "r")) == 0) + { + printf("Filen finns inte!\n"); + return 1; + } + + printf("Position innan läsning: %ld\n", ftell(fp)); + fscanf( fp, "längd: %d, bredd: %d, höjd: %d", + &langd, &bredd, &hojd); + + printf("Lådan har en volym på %d cm3\n", + (langd * bredd * hojd)); + printf("Position efter läsning: %ld\n\n", ftell(fp)); + + printf("Läs tre byte från åttonde byten från starten:\n"); + fseek(fp, 8, SEEK_SET); + for (i = 0; i<3; i++) + { + ch = fgetc(fp); + putchar(ch); + } + printf("\nAktuell position: %ld\n\n", ftell(fp)); + + printf("Flyttar markören 5 bytes framåt och läser resten:\n"); + fseek(fp, 5, SEEK_CUR); + printf("Aktuell position: %ld\n", ftell(fp)); + while ((ch = fgetc(fp)) != EOF) + putchar(ch); + printf("\nAktuell position: %ld\n\n", ftell(fp)); + + return 0; +} diff --git a/kapitel12/konfigfil.txt b/kapitel12/konfigfil.txt new file mode 100644 index 0000000..b2ef628 --- /dev/null +++ b/kapitel12/konfigfil.txt @@ -0,0 +1 @@ +längd: 33, bredd: 20, höjd: 10 diff --git a/kapitel12/lagerhantering-komplett.c b/kapitel12/lagerhantering-komplett.c new file mode 100644 index 0000000..3f35f06 --- /dev/null +++ b/kapitel12/lagerhantering-komplett.c @@ -0,0 +1,360 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include + +/* Makron */ +#define NAMEMAXLENGTH 30 + +/* Globala variabler så att de är tillgängliga både + från main() och de övriga funktionerna. + struct myData används t.ex. både från main() och + new() */ +struct myData +{ + char name[NAMEMAXLENGTH]; + int quantity; + float price; +}; + +char filename[] = "storage.bin"; + +/* Funktionsprototyper */ +void list(struct myData *datap, int numRec); +void search(struct myData *datap, int numRec, char *name); +void modify(struct myData *datap, int numRec, char *name); +void delete(struct myData *datap, int numRec, char *name); +int new(struct myData *datap); +void printUsage(char *arg); +void printHeader(void); + + +int main(int argc, char* argv[]) +{ + FILE *fp; /* Filpekare */ + int newart = 0; /* Ska vi skapa en ny artikel? */ + int numRec; /* För antalet för artiklar */ + int create; /* För y/n-fråga */ + int opt; /* För getopt() */ + + /* Skapa en strukturvariabel (en pekare) av struct myData */ + struct myData *data; + + /* Skriv ut hjälptexten och returnera 1 om vi saknar argument */ + if (argc < 2) + { + printUsage(argv[0]); + return 1; + } + + /* Kontrollera om filen finns och är läs- och skrivbar. + Om inte, fråga om vi ska skapa den och börja läsa + in artiklar. access() är ett systemanrop för Unixmiljöer */ + if ( access(filename, R_OK|W_OK) != 0 ) + { + /* Använd fprintf() för att skriva felmeddelanden + till stderr */ + fprintf(stderr, "Could not open %s\n", filename); + printf("Create the file and start adding records? (y/n): "); + create = getchar(); + if ( create == 'y' ) + { + /* Allokera minne för en struct myData och anropa + sedan new() med en pekare till minnet för att lägga + till artiklar i lagret, en i taget */ + numRec = 1; + data = calloc(numRec, sizeof(struct myData)); + new(data); + free(data); + return 0; + } + else + return 1; + } + + /* Öppna filen i läsläge */ + fp = fopen(filename, "rb"); + + /* Läs in befintlig data från filen till strukturen */ + fseek(fp, 0, SEEK_END); + numRec = ftell(fp) / sizeof(struct myData); + data = calloc(numRec, sizeof(struct myData)); + rewind(fp); + fread(data, sizeof(struct myData), numRec, fp); + fclose(fp); + + /* Behandla argumenten med getopt() */ + while ((opt = getopt(argc, argv, "hls:m:d:n")) != -1) + { + switch (opt) + { + case 'l': + list(data, numRec); + break; + case 's': + search(data, numRec, optarg); + break; + case 'm': + modify(data, numRec, optarg); + break; + case 'd': + delete(data, numRec, optarg); + break; + case 'n': + newart = 1; + break; + case 'h': + printUsage(argv[0]); + return 0; + default: + printUsage(argv[0]); + return 1; + } + } + + /* Fortsätt här om filen finns och vi valde att lägga + till artiklar */ + if ( newart == 1 ) + { + data = calloc(1, sizeof(struct myData)); + if ( new(data) == 1 ) + return 1; + } + + /* Här är programmet klart, så frigör minnet och returnera 0 */ + free(data); + return 0; +} + +/* Funktionerna nedan tar en pekare till datatypen struct myData + som första argument. Som andra argument ett heltal som innehåller + antalet artiklar i lagret. */ +void list(struct myData *datap, int numRec) +{ + int i; + printHeader(); + for (i = 0; iname, NAMEMAXLENGTH, stdin); + datap->name[strcspn(datap->name, "\n")] = '\0'; + + if ( strcmp(datap->name, "done") == 0 ) + { + fclose(fp); + return 0; + } + printf("Quantity: "); scanf("%d", &datap->quantity); + printf("Price: "); scanf("%f", &datap->price); + bytes = fwrite(datap, sizeof(struct myData), 1, fp); + if (bytes != 1) + { + fprintf(stderr, "Could not write to the file!\n"); + return 1; + } + } +} + +void printUsage(char *arg) +{ + fprintf(stderr, "Usage: %s [-l] [-s name] " + "[-m name] \n" + "[-d name] [-n] [-h]\n\n" + "-l = list the articles in the database\n" + "-s name = search for an article named 'name'\n" + "-m name = modify the article named 'name'\n" + " You'll then have the choice to change name, quantity " + "and price.\n" + "-d name = delete the article named 'name'\n" + "-n = create new articles (interactive mode only)\n" + "-h = display this help message\n", arg); +} + +void printHeader(void) +{ + int i; + printf("\n%-30s\t", "Name"); + printf("%s\t", "Quantity"); + printf("%s\t\n", "Price"); + for (i = 0; i<=52; i++) + printf("="); + printf("\n"); +} diff --git a/kapitel12/las-flera-flt.c b/kapitel12/las-flera-flt.c new file mode 100644 index 0000000..afe2c50 --- /dev/null +++ b/kapitel12/las-flera-flt.c @@ -0,0 +1,23 @@ +#include + +int main(void) +{ + /* Korrekt storlek från början på x & y */ + float y[3]; + int x[3]; + int i; + FILE *fp; + if ( (fp = fopen("test.bin", "rb")) == 0 ) + { + fprintf(stderr, "Kan inte öppna filen\n"); + return 1; + } + fread(&y, sizeof(y), 1, fp); /* Först flyttalen */ + fread(&x, sizeof(x), 1, fp); /* Sen heltalen... */ + for (i = 0; i<3; i++) + printf("%f\n", y[i]); + + for (i = 0; i<3; i++) + printf("%d\n", x[i]); + return 0; +} diff --git a/kapitel12/las-flt-fil-ex1.c b/kapitel12/las-flt-fil-ex1.c new file mode 100644 index 0000000..fad35c8 --- /dev/null +++ b/kapitel12/las-flt-fil-ex1.c @@ -0,0 +1,25 @@ +#include + +int main(void) +{ + float y[10]; + int bytes, antal, i; + FILE *fp; + if ( (fp = fopen("test.bin", "rb")) == 0) + { + fprintf(stderr, "Kan inte öppna filen\n"); + return 1; + } + fseek(fp, 0, SEEK_END); /* Flytt till slutet av filen*/ + bytes = ftell(fp); /* Totala antalet bytes */ + rewind(fp); /* Flytta markören till början av filen */ + printf("Antal bytes i filen: %d\n", bytes); + antal = bytes / sizeof(float); /* Hur många element */ + printf("Antal element: %d\n", antal); + fread(&y, sizeof(float), antal, fp); + /* Skriv ut alla flyttalen från filen */ + for (i = 0; i + +int main(void) +{ + float y[3]; + int i; + FILE *fp; + if ( (fp = fopen("test.bin", "rb")) == 0 ) + { + fprintf(stderr, "Kan inte öppna filen\n"); + return 1; + } + fread(&y, sizeof(y), 1, fp); + for (i = 0; i<3; i++) + printf("%f\n", y[i]); + fclose(fp); + return 0; +} diff --git a/kapitel12/lasa-bin-ex1.c b/kapitel12/lasa-bin-ex1.c new file mode 100644 index 0000000..e776596 --- /dev/null +++ b/kapitel12/lasa-bin-ex1.c @@ -0,0 +1,16 @@ +#include + +int main(void) +{ + FILE *binfil; + float x; + if ( (binfil = fopen("flyttal.bin", "rb")) == 0 ) + { + fprintf(stderr, "Kunde inte öppna filen\n"); + return 1; + } + fread(&x, sizeof(x), 1, binfil); + printf("Flyttalet är: %f\n", x); + fclose(binfil); + return 0; +} diff --git a/kapitel12/lasa-fil-ex1.c b/kapitel12/lasa-fil-ex1.c new file mode 100644 index 0000000..4a4bac2 --- /dev/null +++ b/kapitel12/lasa-fil-ex1.c @@ -0,0 +1,14 @@ +#include + +int main(void) +{ + FILE *fp; + signed char c; + + fp = fopen("test.txt", "r"); + while ((c = getc(fp)) != EOF) + putchar(c); + fclose(fp); + + return 0; +} diff --git a/kapitel12/lasa-fil-ex2.c b/kapitel12/lasa-fil-ex2.c new file mode 100644 index 0000000..ba4e39c --- /dev/null +++ b/kapitel12/lasa-fil-ex2.c @@ -0,0 +1,32 @@ +#include +#include + +int main(void) +{ + FILE *fp; + int strSize, readSize; + char *buffer; + fp = fopen("test.txt", "r"); + + /* Ta reda på storleken och återgå sen till start */ + fseek(fp, 0, SEEK_END); + strSize = ftell(fp); + rewind(fp); + + /* Skapa dynamiskt minne för filens innehåll */ + buffer = calloc(sizeof(char), strSize+1); + + /* Läs in filens innehåll och spara antalet inlästa + tecken i 'readSize' */ + readSize = fread(buffer, sizeof(char), strSize, fp); + + fclose(fp); /* Vi är klara med fp så stäng den */ + + printf("%s\n\n", buffer); + printf("Storleken är %d tecken och vi läste in %d tecken\n", + strSize, readSize); + + free(buffer); /* Frigör det dynamiska minnet */ + + return 0; +} diff --git a/kapitel12/lasa-fil-ex3-c99.c b/kapitel12/lasa-fil-ex3-c99.c new file mode 100644 index 0000000..af7ed62 --- /dev/null +++ b/kapitel12/lasa-fil-ex3-c99.c @@ -0,0 +1,33 @@ +#define _XOPEN_SOURCE 600 +#include +#include +#include +#include +#include +#include + +int main(void) +{ + FILE *fp; + off_t filesize; + int fd, readSize; + struct stat fileinfo; + char* buffer; + fp = fopen("test.txt", "r"); + + fd = fileno(fp); /* Hämta fildeskriptorn och spara i fd */ + fstat(fd, &fileinfo); /* Hämta all information till 'fileinfo' */ + filesize = fileinfo.st_size; /* Spara filens storlek i filesize */ + /* från 'fileinfo.st_size' */ + + buffer = calloc(sizeof(char), filesize+1); + readSize = fread(buffer, sizeof(char), filesize, fp); + buffer[filesize] = '\0'; + + printf("%s\n\n", buffer); + printf("Fildeskriptor: %d\n", fd); + printf("Filens storlek är %jd byte och vi har läst in %d byte\n", + (intmax_t)filesize, readSize); + + return 0; +} diff --git a/kapitel12/lasa-fil-ex3.c b/kapitel12/lasa-fil-ex3.c new file mode 100644 index 0000000..c67300a --- /dev/null +++ b/kapitel12/lasa-fil-ex3.c @@ -0,0 +1,32 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include + +int main(void) +{ + FILE *fp; + off_t filesize; + int fd, readSize; + struct stat fileinfo; + char* buffer; + fp = fopen("test.txt", "r"); + + fd = fileno(fp); /* Hämta fildeskriptorn och spara i fd */ + fstat(fd, &fileinfo); /* Hämta all information till 'fileinfo' */ + filesize = fileinfo.st_size; /* Spara filens storlek i filesize */ + /* från 'fileinfo.st_size' */ + + buffer = calloc(sizeof(char), filesize+1); + readSize = fread(buffer, sizeof(char), filesize, fp); + buffer[filesize] = '\0'; + + printf("%s\n\n", buffer); + printf("Fildeskriptor: %d\n", fd); + printf("Filens storlek är %ld byte och vi har läst in %d byte\n", + (long int)filesize, readSize); + + return 0; +} diff --git a/kapitel12/lasa-matt.c b/kapitel12/lasa-matt.c new file mode 100644 index 0000000..bda2ccf --- /dev/null +++ b/kapitel12/lasa-matt.c @@ -0,0 +1,27 @@ +#include + +int main(void) +{ + int langd, bredd, hojd; + FILE *fp; + + /* Kontrollera först om filen finns och om inte + avsluta programmet och skriv ett felmeddelande */ + if ( (fp = fopen("konfigfil.txt", "r")) == 0) + { + printf("Filen finns inte!\n"); + return 1; + } + + /* Läs in de olika "fälten" från filen till rätt + variabel */ + fscanf( fp, "längd: %d, bredd: %d, höjd: %d", + &langd, &bredd, &hojd); + + /* Skriv ut volymen */ + printf("Lådan har en volym på %d cm3\n", + (langd * bredd * hojd)); + + return 0; + +} diff --git a/kapitel12/lasa-person-struct.c b/kapitel12/lasa-person-struct.c new file mode 100644 index 0000000..96c89b8 --- /dev/null +++ b/kapitel12/lasa-person-struct.c @@ -0,0 +1,38 @@ +#include +#include + +#define MAXLANGD 30 +#define ANTAL 3 + +int main(void) +{ + FILE *fp; + int i; + struct minData + { + char fnamn[MAXLANGD]; + char enamn[MAXLANGD]; + int alder; + }; + + struct minData personer[ANTAL]; + + if ( (fp= fopen("personer.bin", "rb")) == 0 ) + { + fprintf(stderr, "Kan inte öppna filen\n"); + return 1; + } + + /* Läs in strukturen från filen */ + fread(personer, sizeof(struct minData), ANTAL, fp); + + /* Loopa igenom alla personer i strukturen */ + for (i = 0; i + +int main(void) +{ + FILE *binfil; + float x; + /* Kontrollera om fopen lyckades öppna filen + i skrivläge */ + if ( (binfil = fopen("flyttal.bin", "wb")) == 0 ) + { + /* Skriv felmeddelande till stderr */ + fprintf(stderr, "Kan inte skriva till fil\n"); + return 1; + } + printf("Skriv ett flyttal: "); + scanf("%f", &x); + fwrite(&x, sizeof(x), 1, binfil); + fclose(binfil); + return 0; +} diff --git a/kapitel12/skriv-fil-ex1.c b/kapitel12/skriv-fil-ex1.c new file mode 100644 index 0000000..ff26509 --- /dev/null +++ b/kapitel12/skriv-fil-ex1.c @@ -0,0 +1,18 @@ +#include + +int main(void) +{ + FILE *fp; + char namn1[] = "Knatte"; + char namn2[] = "Fnatte"; + + fp = fopen("test.txt", "w"); + + fprintf(fp, "%s, %s och Tjatte\n" + "bor alla i Ankeborg.\n\n", namn1, namn2); + fputs("Kalle och Lisa bor också i Ankeborg.\n", fp); + + fclose(fp); + + return 0; +} diff --git a/kapitel12/skriv-flera-flt.c b/kapitel12/skriv-flera-flt.c new file mode 100644 index 0000000..36bb604 --- /dev/null +++ b/kapitel12/skriv-flera-flt.c @@ -0,0 +1,18 @@ +#include + +int main(void) +{ + float y[3] = {3.14, 5.55, 9.56}; + int x[3] = {99, 101, 105}; + FILE *fp; + if ( (fp = fopen("test.bin", "wb")) == 0 ) + { + fprintf(stderr, "Kan inte läsa filen\n"); + return 1; + } + + fwrite(&y, sizeof(y), 1, fp); + fwrite(&x, sizeof(x), 1, fp); + fclose(fp); + return 0; +} diff --git a/kapitel12/skriv-flt-fil.c b/kapitel12/skriv-flt-fil.c new file mode 100644 index 0000000..38a39b0 --- /dev/null +++ b/kapitel12/skriv-flt-fil.c @@ -0,0 +1,15 @@ +#include + +int main(void) +{ + float y[3] = {3.14, 5.55, 9.56}; + FILE *fp; + if ( (fp = fopen("test.bin", "wb")) == 0 ) + { + fprintf(stderr, "Kan inte öppna filen\n"); + return 1; + } + fwrite(&y, sizeof(y), 1, fp); + fclose(fp); + return 0; +} diff --git a/kapitel12/skriv-person-struct.c b/kapitel12/skriv-person-struct.c new file mode 100644 index 0000000..aa18d95 --- /dev/null +++ b/kapitel12/skriv-person-struct.c @@ -0,0 +1,42 @@ +#include +#include + +#define MAXLANGD 30 +#define ANTAL 3 + +int main(void) +{ + FILE *fp; + struct minData + { + char fnamn[MAXLANGD]; + char enamn[MAXLANGD]; + int alder; + }; + + struct minData personer[ANTAL]; + + if ( (fp = fopen("personer.bin", "wb")) == 0 ) + { + fprintf(stderr, "Kan inte öppna filen\n"); + return 1; + } + + /* Skapa tre person i strukturen */ + strcpy(personer[0].fnamn, "Kalle"); + strcpy(personer[0].enamn, "Anka"); + personer[0].alder = 31; + + strcpy(personer[1].fnamn, "Lisa"); + strcpy(personer[1].enamn, "Anka"); + personer[1].alder = 28; + + strcpy(personer[2].fnamn, "Fnatte"); + strcpy(personer[2].enamn, "Anka"); + personer[2].alder = 8; + + /* Skriv ut strukturen till en fil */ + fwrite(personer, sizeof(struct minData), ANTAL, fp); + + return 0; +} diff --git a/kapitel13/filinfo-portabel.c b/kapitel13/filinfo-portabel.c new file mode 100644 index 0000000..9663275 --- /dev/null +++ b/kapitel13/filinfo-portabel.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#if __STDC_VERSION__ >= 199901L +#define C99 +#include +#endif + +int main(int argc, char *argv[]) +{ + struct stat fileinfo; + if (argc != 2) + { + fprintf(stderr, "Usage: %s path/to/file\n", argv[0]); + return 1; + } + + stat(argv[1], &fileinfo); + + #ifdef C99 + printf("C99 (or newer)\n"); + printf("Inode number: %ju\n", + (uintmax_t)fileinfo.st_ino); + printf("Size in bytes: %jd (%.2f kilobytes)\n", + (intmax_t)fileinfo.st_size, + (double)fileinfo.st_size / 1024); + #else + printf("C89\n"); + printf("Inode number: %lu\n", (unsigned long int)fileinfo.st_ino); + printf("Size in bytes: %lu (%.2f kilobytes)\n", + (unsigned long int)fileinfo.st_size, + (float)fileinfo.st_size / 1024); + #endif + printf("User-ID: %d\n", fileinfo.st_uid); + printf("Group-ID: %d\n", fileinfo.st_gid); + + return 0; +} diff --git a/kapitel13/filinfo.c b/kapitel13/filinfo.c new file mode 100644 index 0000000..af7c82f --- /dev/null +++ b/kapitel13/filinfo.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + struct stat fileinfo; + if (argc != 2) + { + fprintf(stderr, "Usage: %s path/to/file\n", argv[0]); + return 1; + } + + stat(argv[1], &fileinfo); + + printf("Inode number: %lu\n", (unsigned long int)fileinfo.st_ino); + printf("Size in bytes: %lu (%.2f kilobytes)\n", + (unsigned long int)fileinfo.st_size, + (float)fileinfo.st_size / 1024); + printf("User-ID: %d\n", fileinfo.st_uid); + printf("Group-ID: %d\n", fileinfo.st_gid); + + return 0; +} diff --git a/kapitel13/mychown-felhantering-ex1.c b/kapitel13/mychown-felhantering-ex1.c new file mode 100644 index 0000000..50cfeeb --- /dev/null +++ b/kapitel13/mychown-felhantering-ex1.c @@ -0,0 +1,42 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + uid_t uid; + gid_t gid; + + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + uid = (uid_t)atoi(argv[2]); + gid = (gid_t)atoi(argv[3]); + + if (chown(argv[1], uid, gid) == -1) + { + switch (errno) + { + case EPERM: + fprintf(stderr, "Operation not permitted\n"); + break; + case ENOENT: + fprintf(stderr, "No such file or directory\n"); + break; + case ENAMETOOLONG: + fprintf(stderr, "Filename too long\n"); + break; + default: + fprintf(stderr, "Unknown error\n"); + break; + } + return 1; + } + + return 0; +} diff --git a/kapitel13/mychown-felhantering-ex2.c b/kapitel13/mychown-felhantering-ex2.c new file mode 100644 index 0000000..05682db --- /dev/null +++ b/kapitel13/mychown-felhantering-ex2.c @@ -0,0 +1,30 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + uid_t uid; + gid_t gid; + + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + uid = (uid_t)atoi(argv[2]); + gid = (gid_t)atoi(argv[3]); + + if (chown(argv[1], uid, gid) == -1) + { + printf("%i\n", errno); /* Visar vad errno innehåller */ + printf("%s\n", strerror(errno)); /* Meddelandet i klartext */ + return 1; + } + + return 0; +} diff --git a/kapitel13/mychown-felhantering-ex3.c b/kapitel13/mychown-felhantering-ex3.c new file mode 100644 index 0000000..7d9c582 --- /dev/null +++ b/kapitel13/mychown-felhantering-ex3.c @@ -0,0 +1,27 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + uid_t uid; + gid_t gid; + + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + uid = (uid_t)atoi(argv[2]); + gid = (gid_t)atoi(argv[3]); + + if (chown(argv[1], uid, gid) == -1) + { + perror("chown"); + return 1; + } + return 0; +} diff --git a/kapitel13/mychown.c b/kapitel13/mychown.c new file mode 100644 index 0000000..4b90ad9 --- /dev/null +++ b/kapitel13/mychown.c @@ -0,0 +1,27 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include + +int main(int argc, char *argv[]) +{ + uid_t uid; + gid_t gid; + + if (argc != 4) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + uid = (uid_t)atoi(argv[2]); + gid = (gid_t)atoi(argv[3]); + + if (chown(argv[1], uid, gid) == -1) + { + fprintf(stderr, "Could not change UID or GID\n"); + return 1; + } + + return 0; +} diff --git a/kapitel13/mytouch.c b/kapitel13/mytouch.c new file mode 100644 index 0000000..ca88b40 --- /dev/null +++ b/kapitel13/mytouch.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + /* Rättigheterna nedan blir 644, Read/Write user, + Read group, Read others */ + creat(argv[1], S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if (errno != 0) + { + perror("creat"); + return 1; + } + return 0; +} diff --git a/kapitel13/write-ex1.c b/kapitel13/write-ex1.c new file mode 100644 index 0000000..d406854 --- /dev/null +++ b/kapitel13/write-ex1.c @@ -0,0 +1,8 @@ +#include +#include + +int main(void) +{ + write(1, "Hejsan\n", 7); + return 0; +} diff --git a/kapitel13/write-ex2.c b/kapitel13/write-ex2.c new file mode 100644 index 0000000..08340d6 --- /dev/null +++ b/kapitel13/write-ex2.c @@ -0,0 +1,8 @@ +#include +#include + +int main(void) +{ + write(STDOUT_FILENO, "Hejsan\n", 7); + return 0; +} diff --git a/kapitel14/fahr-felhantering.c b/kapitel14/fahr-felhantering.c new file mode 100644 index 0000000..3c7fd93 --- /dev/null +++ b/kapitel14/fahr-felhantering.c @@ -0,0 +1,40 @@ +#include +#include +#include + +/* Funktionsprototyp av isNumeric */ +int isNumeric(const char *str); + +int main(void) +{ + char c[10]; + float cels, f; + while(fgets(c, sizeof(c), stdin) != NULL) + { + if (isNumeric(c)) + { + cels = atof(c); /* char till float (stdlib.h) */ + f = cels*9/5+32; + printf("%.1f\n", f); + } + else + { + fprintf(stderr, "Påträffade icke-numeriskt värde\n"); + return 1; + } + } + return 0; +} + +/* Funktionen för att kontrollera inmatade tecken */ +int isNumeric(const char *str) +{ + if(strspn(str, "0123456789.-\n") == strlen(str)) /*string.h*/ + { + return 1; + } + else + { + return 0; + } +} diff --git a/kapitel14/fahr.c b/kapitel14/fahr.c new file mode 100644 index 0000000..24f1244 --- /dev/null +++ b/kapitel14/fahr.c @@ -0,0 +1,15 @@ +#include +#include + +int main(void) +{ + char c[10]; + float cels, f; + while(fgets(c, sizeof(c), stdin) != NULL) + { + cels = atof(c); /* gör om char till float (stdlib.h) */ + f = cels*9/5+32; + printf("%.1f\n", f); + } + return 0; +} diff --git a/kapitel14/miljovar-ex1.c b/kapitel14/miljovar-ex1.c new file mode 100644 index 0000000..9d2875d --- /dev/null +++ b/kapitel14/miljovar-ex1.c @@ -0,0 +1,29 @@ +#include +#include +#include + +int main(void) +{ + /* Spara ett värde för senare användning */ + const char* myhome = getenv("HOME"); + + /* Skriv ut några miljövariabler */ + printf("Ditt UID är: %i\n", getuid()); + printf("Ditt GID är: %i\n", getgid()); + printf("Ditt användarnamn är: %s\n", getenv("USER")); + printf("Det aktuella programmet heter: %s\n", getenv("_")); + + printf("Din hemkatalog är: %s\n", myhome); + + /* Testa om en variabel är satt eller inte */ + if (getenv("DISPLAY")) + { + printf("Du använder X-Window just nu\n"); + } + else + { + printf("Du använder inte X-Window just nu\n"); + } + + return 0; +} diff --git a/kapitel14/miljovar-ex2.c b/kapitel14/miljovar-ex2.c new file mode 100644 index 0000000..13f7374 --- /dev/null +++ b/kapitel14/miljovar-ex2.c @@ -0,0 +1,11 @@ +#define _XOPEN_SOURCE 600 +#include +#include + +int main(void) +{ + setenv("MINVAR", "J-B", 0); /* sätt variabeln (0 = skriv ej + över ev. befintlig variabel) */ + printf("%s\n", getenv("MINVAR")); /* testa om det fungerade */ + return 0; +} diff --git a/kapitel14/outerrtest.c b/kapitel14/outerrtest.c new file mode 100644 index 0000000..c48a2a9 --- /dev/null +++ b/kapitel14/outerrtest.c @@ -0,0 +1,8 @@ +#include + +int main(void) +{ + fprintf(stdout, "Text till stdout\n"); + fprintf(stderr, "Ett felmeddelande\n"); + return 0; +} diff --git a/kapitel14/temps.txt b/kapitel14/temps.txt new file mode 100644 index 0000000..ea6d05f --- /dev/null +++ b/kapitel14/temps.txt @@ -0,0 +1,5 @@ +22 +23 +25 +30 +31 diff --git a/kapitel14/testtmp.txt b/kapitel14/testtmp.txt new file mode 100644 index 0000000..d15a782 --- /dev/null +++ b/kapitel14/testtmp.txt @@ -0,0 +1,10 @@ +id=151 temperature=-4.6 humidity=92 time=2016-11-13 22:50:20 +id=167 temperature=22.1 humidity=20 time=2016-11-13 22:49:34 +id=151 temperature=-4.6 humidity=92 time=2016-11-13 22:53:32 +id=167 temperature=22.0 humidity=20 time=2016-11-13 22:53:34 +id=151 temperature=-4.6 humidity=92 time=2016-11-13 22:56:44 +id=167 temperature=22.3 humidity=20 time=2016-11-13 22:56:45 +id=151 temperature=-4.7 humidity=92 time=2016-11-13 22:59:56 +id=167 temperature=22.4 humidity=20 time=2016-11-13 22:59:57 +id=151 temperature=-4.7 humidity=92 time=2016-11-13 23:02:20 +id=167 temperature=22.4 humidity=20 time=2016-11-13 23:02:21 diff --git a/kapitel15/exempel.c b/kapitel15/exempel.c new file mode 100644 index 0000000..57efab2 --- /dev/null +++ b/kapitel15/exempel.c @@ -0,0 +1,11 @@ +#include + +int main(void) +{ + int x, y; + x = 5; + + printf("x = %d\n", x); + printf("Adressen till x är %lu\n", &x); + return 0; +} diff --git a/kapitel15/funk.c b/kapitel15/funk.c new file mode 100644 index 0000000..aaa7ced --- /dev/null +++ b/kapitel15/funk.c @@ -0,0 +1,4 @@ +int kvadrat(int n) +{ + return n*n; +} diff --git a/kapitel15/funk.h b/kapitel15/funk.h new file mode 100644 index 0000000..f6cab38 --- /dev/null +++ b/kapitel15/funk.h @@ -0,0 +1 @@ +int kvadrat(int n); diff --git a/kapitel15/jbmath/jbmath.c b/kapitel15/jbmath/jbmath.c new file mode 100644 index 0000000..a87cfb9 --- /dev/null +++ b/kapitel15/jbmath/jbmath.c @@ -0,0 +1,10 @@ +float circumf(float diameter) +{ + const float pi = 3.14159265; + return (pi * diameter); +} + +float area(float length, float height) +{ + return (length * height); +} diff --git a/kapitel15/jbmath/jbmath.h b/kapitel15/jbmath/jbmath.h new file mode 100644 index 0000000..171e5ef --- /dev/null +++ b/kapitel15/jbmath/jbmath.h @@ -0,0 +1,3 @@ +float circumf(float diameter); +float area(float length, float height); +long jbpow(int x, int n); diff --git a/kapitel15/jbmath/jbpow.c b/kapitel15/jbmath/jbpow.c new file mode 100644 index 0000000..9bf1874 --- /dev/null +++ b/kapitel15/jbmath/jbpow.c @@ -0,0 +1,10 @@ +long jbpow(int x, int n) +{ + long num = 1; + int i; + for(i = 0; i +#include + +int main(void) +{ + printf("En cirkel med diametern 5.5 har omkretsen %.3f\n", + circumf(5.5)); + printf("En rektangel med sidorna 3 och 8.5 har arean %.3f\n", + area(3, 8.5)); + printf("5 upphöjt till 6 är %ld\n", jbpow(5, 6)); + return 0; +} diff --git a/kapitel15/jbmath/usemath.c b/kapitel15/jbmath/usemath.c new file mode 100644 index 0000000..32799d9 --- /dev/null +++ b/kapitel15/jbmath/usemath.c @@ -0,0 +1,12 @@ +#include +#include "jbmath.h" + +int main(void) +{ + printf("En cirkel med diametern 5.5 har omkretsen %.3f\n", + circumf(5.5)); + printf("En rektangel med sidorna 3 och 8.5 har arean %.3f\n", + area(3, 8.5)); + printf("5 upphöjt till 6 är %ld\n", jbpow(5, 6)); + return 0; +} diff --git a/kapitel15/matte/Makefile b/kapitel15/matte/Makefile new file mode 100644 index 0000000..3801ac3 --- /dev/null +++ b/kapitel15/matte/Makefile @@ -0,0 +1,17 @@ +CC=cc +CFLAGS=-Wall -Wextra -pedantic -std=c99 -D_XOPEN_SOURCE=600 + +matte: matte.o minmattefunk.o usage.o + $(CC) -o matte matte.o minmattefunk.o usage.o + +matte.o: matte.c minmattefunk.h usage.h + $(CC) $(CFLAGS) -c matte.c + +minmattefunk.o: minmattefunk.c + $(CC) $(CFLAGS) -c minmattefunk.c + +usage.o: usage.c + $(CC) $(CFLAGS) -c usage.c + +clean: + rm matte minmattefunk.o matte.o usage.o diff --git a/kapitel15/matte/matte.c b/kapitel15/matte/matte.c new file mode 100644 index 0000000..d49753d --- /dev/null +++ b/kapitel15/matte/matte.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include "minmattefunk.h" +#include "usage.h" + +int main(int argc, char **argv) +{ + int opt; + if (argc == 1) + { + printUsage(argv[0]); + return 1; + } + + while ((opt = getopt(argc, argv, "s:c:")) != -1) + { + switch (opt) + { + case 's': + printf("%d squared is %d\n", atoi(optarg), + kvadrat(atoi(optarg))); + break; + case 'c': + printf("%d cubed is %d \n", atoi(optarg), + kubik(atoi(optarg))); + break; + default: + printUsage(argv[0]); + return 1; + } + } + return 0; +} diff --git a/kapitel15/matte/minmattefunk.c b/kapitel15/matte/minmattefunk.c new file mode 100644 index 0000000..71c8fd8 --- /dev/null +++ b/kapitel15/matte/minmattefunk.c @@ -0,0 +1,9 @@ +int kvadrat(int x) +{ + return x*x; +} + +int kubik(int x) +{ + return x*x*x; +} diff --git a/kapitel15/matte/minmattefunk.h b/kapitel15/matte/minmattefunk.h new file mode 100644 index 0000000..41c0f1b --- /dev/null +++ b/kapitel15/matte/minmattefunk.h @@ -0,0 +1,2 @@ +int kvadrat(int x); +int kubik(int x); diff --git a/kapitel15/matte/usage.c b/kapitel15/matte/usage.c new file mode 100644 index 0000000..c6ce378 --- /dev/null +++ b/kapitel15/matte/usage.c @@ -0,0 +1,8 @@ +#include + +void printUsage(char *arg) +{ + printf("Usage: %s (-s) | (-c) (integer)\n" + "-s = calculate the square of an integer\n" + "-c = calculate the cube of an integer\n", arg); +} diff --git a/kapitel15/matte/usage.h b/kapitel15/matte/usage.h new file mode 100644 index 0000000..18b3f0c --- /dev/null +++ b/kapitel15/matte/usage.h @@ -0,0 +1 @@ +void printUsage(char *arg); diff --git a/kapitel15/matte/version2.Makefile b/kapitel15/matte/version2.Makefile new file mode 100644 index 0000000..9b2d240 --- /dev/null +++ b/kapitel15/matte/version2.Makefile @@ -0,0 +1,10 @@ +CC=cc +CFLAGS=-Wall -Wextra -pedantic -std=c99 -D_XOPEN_SOURCE=600 + +matte: matte.o minmattefunk.o usage.o + $(CC) -o matte matte.o minmattefunk.o usage.o + +matte.o: minmattefunk.h usage.h + +clean: + rm matte minmattefunk.o matte.o usage.o diff --git a/kapitel15/matte/version3.Makefile b/kapitel15/matte/version3.Makefile new file mode 100644 index 0000000..f4cc30c --- /dev/null +++ b/kapitel15/matte/version3.Makefile @@ -0,0 +1,11 @@ +CC=cc +CFLAGS=-Wall -Wextra -pedantic -std=c99 -D_XOPEN_SOURCE=600 +OBJS=matte.o minmattefunk.o usage.o + +matte: $(OBJS) + $(CC) -o matte $(OBJS) + +matte.o: minmattefunk.h usage.h + +clean: + rm matte $(OBJS) diff --git a/kapitel15/matte/version4.Makefile b/kapitel15/matte/version4.Makefile new file mode 100644 index 0000000..79ddbdf --- /dev/null +++ b/kapitel15/matte/version4.Makefile @@ -0,0 +1,18 @@ +CC=cc +CFLAGS=-Wall -Wextra -pedantic -std=c99 -D_XOPEN_SOURCE=600 +OBJS=matte.o minmattefunk.o usage.o +PREFIX=/usr/local + +matte: $(OBJS) + $(CC) -o matte $(OBJS) + +matte.o: minmattefunk.h usage.h + +clean: + rm matte $(OBJS) + +install: + cp matte $(DESTDIR)$(PREFIX)/bin/matte + +uninstall: + rm $(DESTDIR)$(PREFIX)/bin/matte diff --git a/kapitel15/prog.c b/kapitel15/prog.c new file mode 100644 index 0000000..dce3b66 --- /dev/null +++ b/kapitel15/prog.c @@ -0,0 +1,7 @@ + #include "funk.h" + #define TAL 8 + + int main(void) + { + return kvadrat(TAL); + } diff --git a/kapitel16/daemon-ex1.c b/kapitel16/daemon-ex1.c new file mode 100644 index 0000000..610ebb3 --- /dev/null +++ b/kapitel16/daemon-ex1.c @@ -0,0 +1,66 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +int main(void) +{ + pid_t process_id = 0; + pid_t sid = 0; + /* Skapa barn/child process */ + process_id = fork(); + /* Hantera eventuellt fel vid fork() */ + if (process_id < 0) + { + fprintf(stderr, "fork failed!\n"); + exit(1); + } + /* Förälderprocessen/parent process. Avsluta den */ + else if (process_id > 0) + { + exit(0); + } + /* Starta en ny session */ + sid = setsid(); + if(sid < 0) + { + /* Avsluta ifall det inte gick att skapa en ny + session */ + fprintf(stderr, "Failure to set new session\n"); + exit(1); + } + /* Gör en ny fork (dubbel-fork). Detta blir demonen */ + process_id = fork(); + /* Hantera eventuellt fel vid fork() */ + if (process_id < 0) + { + fprintf(stderr, "fork failed!\n"); + exit(1); + } + /* Förälderprocessen/parent process. + Avsluta den eftersom allt arbete kommer att + utföras av demonen. Skriv också ut demonens PID */ + else if (process_id > 0) + { + printf("Daemon process: %d \n", process_id); + exit(0); + } + /* Sätt umask till 022 (rw-r--r-- / rwx-r-xr-x) */ + umask(022); + /* Ändra aktuell katalog till / */ + chdir("/"); + /* Stäng stdin, stdout och stderr och återöppna dem till + /dev/null. Dessa behövs inte i en demonprocess */ + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + open("/dev/null", O_RDONLY); /* 0 = stdin */ + open("/dev/null", O_WRONLY); /* 1 = stdout */ + open("/dev/null", O_RDWR); /* 2 = stderr */ + /* Här börjar demonens arbete... */ + for(;;) + { + sleep(5); + } +} diff --git a/kapitel16/execldemo.c b/kapitel16/execldemo.c new file mode 100644 index 0000000..c72e6cf --- /dev/null +++ b/kapitel16/execldemo.c @@ -0,0 +1,12 @@ +#include +#include +#include + +int main(void) +{ + sleep(15); + execl("/usr/bin/man", "man", "ls", (char *)NULL); + perror("execl"); + + return 0; +} diff --git a/kapitel16/forkdemo-ex2.c b/kapitel16/forkdemo-ex2.c new file mode 100644 index 0000000..fdb622c --- /dev/null +++ b/kapitel16/forkdemo-ex2.c @@ -0,0 +1,29 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include + +int main(void) +{ + pid_t pid; + int status; + pid = fork(); + if (pid == 0) + { + execl("/usr/bin/man", "man", "ls", (char *)NULL); + perror("execl"); + } + else if (pid > 0) + { + waitpid(pid, &status, 0); + printf("Barnet är klart, återgår till förälderprocessen\n"); + printf("Barnet returnerade %i\n", status); + } + else + { + fprintf(stderr, "Något gick fel med fork()\n"); + return 1; + } + + return 0; +} diff --git a/kapitel16/forkdemo.c b/kapitel16/forkdemo.c new file mode 100644 index 0000000..209e22e --- /dev/null +++ b/kapitel16/forkdemo.c @@ -0,0 +1,25 @@ +#define _XOPEN_SOURCE 500 +#include +#include + +int main(void) +{ + pid_t pid; + pid = fork(); + if (pid == 0) + { + printf("Jag är barnprocessen\n"); + sleep(30); + } + else if (pid > 0) + { + printf("Jag är förälderprocessen\n"); + sleep(30); + } + else + { + fprintf(stderr, "Något gick fel med fork()\n"); + return 1; + } + return 0; +} diff --git a/kapitel16/systest.c b/kapitel16/systest.c new file mode 100644 index 0000000..2f368a1 --- /dev/null +++ b/kapitel16/systest.c @@ -0,0 +1,9 @@ +#include +#include + +int main(void) +{ + if (system("man ls") == -1) + fprintf(stderr, "Could not create child process\n"); + return 0; +} diff --git a/kapitel16/zombie.c b/kapitel16/zombie.c new file mode 100644 index 0000000..6d50d2c --- /dev/null +++ b/kapitel16/zombie.c @@ -0,0 +1,28 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include + +int main(void) +{ + pid_t pid; + pid = fork(); + if (pid == 0) + { + printf("Jag är barnprocessen och kommer bli en zombie\n"); + exit(0); + } + else if (pid > 0) + { + printf("Jag är föräldern och kommer att köras i " + "100 sekunder\n"); + sleep(100); + } + else + { + fprintf(stderr, "Något gick fel med fork()\n"); + return 1; + } + + return 0; +} diff --git a/kapitel17/daemon-ex2.c b/kapitel17/daemon-ex2.c new file mode 100644 index 0000000..9203041 --- /dev/null +++ b/kapitel17/daemon-ex2.c @@ -0,0 +1,108 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include +#include + +void sigHandler(int sig); + +int main(void) +{ + pid_t process_id = 0; + pid_t sid = 0; + FILE *fp; + char pidfile[] = "/tmp/daemon-sig-ex.pid"; + /* Skapa barn/child process */ + process_id = fork(); + + /* Hantera eventuellt fel vid fork() */ + if (process_id < 0) + { + fprintf(stderr, "fork misslyckades!\n"); + exit(1); + } + /* Avsluta förälderprocessen */ + else if (process_id > 0) + { + exit(1); + } + + /* Starta en ny session */ + sid = setsid(); + if(sid < 0) + { + /* Avsluta ifall det inte gick att skapa en ny + session */ + fprintf(stderr, "Misslyckades att skapa en ny session\n"); + exit(1); + } + /* Gör en ny fork för att förhindra att demonen kan bli en + sessionsledare */ + process_id = fork(); + + /* Hantera eventuellt fel vid fork() */ + if (process_id < 0) + { + fprintf(stderr, "fork misslyckades!\n"); + exit(1); + } + /* Avsluta föräldern den eftersom allt arbete kommer att + utföras av demonen. Skriv också demonens PID-fil */ + else if (process_id > 0) + { + printf("Demonens PID: %d \n", process_id); + fp = fopen(pidfile, "w"); + fprintf(fp, "%d", process_id); + fclose(fp); + exit(0); + } + /* Sätt umask till 022 (rw-r--r-- / rwx-r-xr-x) */ + umask(022); + + /* Ändra aktuell katalog till / */ + chdir("/"); + + /* Stäng stdin, stdout och stderr och återöppna dem + till /dev/null */ + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + open("/dev/null", O_RDONLY); /* 0 = stdin */ + open("/dev/null", O_WRONLY); /* 1 = stdout */ + open("/dev/null", O_RDWR); /* 2 = stderr */ + + /* Registrera signalhanterarna, en för varje signal + som vi vill fånga upp */ + signal(SIGUSR1, sigHandler); + signal(SIGTERM, sigHandler); + /* Demonens arbete... */ + for(;;) + { + sleep(5); + } + return 0; +} + +void sigHandler(int sig) +{ + if (sig == SIGUSR1) + { + /* Skriv till syslog-demonen */ + syslog(LOG_DAEMON, "Tog emot SIGUSR1"); + } + else if (sig == SIGTERM) + { + /* Samma som ovan */ + syslog(LOG_DAEMON, "Tog emot SIGTERM"); + } + else + { + syslog(LOG_DAEMON, "Någonting hände med demonen..."); + } + /* Signalhanteraren återställs efter första signalen, + vi måste därför sätta den igen */ + signal(sig, sigHandler); +} diff --git a/kapitel17/daemon-sig-ex1.c b/kapitel17/daemon-sig-ex1.c new file mode 100644 index 0000000..9bb7994 --- /dev/null +++ b/kapitel17/daemon-sig-ex1.c @@ -0,0 +1,106 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include +#include +void sigHandler(int sig); +int main(void) +{ + pid_t process_id = 0; + pid_t sid = 0; + FILE *fp; + char pidfile[] = "/tmp/daemon-sig-ex.pid"; + /* Skapa barn/child process */ + process_id = fork(); + + /* Hantera eventuellt fel vid fork() */ + if (process_id < 0) + { + fprintf(stderr, "fork misslyckades!\n"); + exit(1); + } + /* Avsluta förälderprocessen */ + else if (process_id > 0) + { + exit(1); + } + + /* Starta en ny session */ + sid = setsid(); + if(sid < 0) + { + /* Avsluta ifall det inte gick att skapa en ny + session */ + fprintf(stderr, "Misslyckades att skapa en ny session\n"); + exit(1); + } + /* Gör en ny fork för att förhindra att demonen kan bli en + sessionsledare */ + process_id = fork(); + + /* Hantera eventuellt fel vid fork() */ + if (process_id < 0) + { + fprintf(stderr, "fork misslyckades!\n"); + exit(1); + } + /* Avsluta föräldern den eftersom allt arbete kommer att + utföras av demonen. Skriv också demonens PID-fil */ + else if (process_id > 0) + { + printf("Demonens PID: %d \n", process_id); + fp = fopen(pidfile, "w"); + fprintf(fp, "%d", process_id); + fclose(fp); + exit(0); + } + /* Sätt umask till 022 (rw-r--r-- / rwx-r-xr-x) */ + umask(022); + + /* Ändra aktuell katalog till / */ + chdir("/"); + + /* Stäng stdin, stdout och stderr och återöppna dem + till /dev/null */ + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + open("/dev/null", O_RDONLY); /* 0 = stdin */ + open("/dev/null", O_WRONLY); /* 1 = stdout */ + open("/dev/null", O_RDWR); /* 2 = stderr */ + + /* Registrera signalhanterarna, en för varje signal + som vi vill fånga upp */ + signal(SIGUSR1, sigHandler); + signal(SIGTERM, sigHandler); + /* Demonens arbete... */ + for(;;) + { + sleep(5); + } + return 0; +} + +void sigHandler(int sig) +{ + if (sig == SIGUSR1) + { + /* Skriv till syslog-demonen */ + syslog(LOG_DAEMON, "Tog emot SIGUSR1"); + } + else if (sig == SIGTERM) + { + /* Samma som ovan */ + syslog(LOG_DAEMON, "Tog emot SIGTERM"); + } + else + { + syslog(LOG_DAEMON, "Någonting hände med demonen..."); + } + /* Signalhanteraren återställs efter första signalen, + vi måste därför sätta den igen */ + signal(sig, sigHandler); +} diff --git a/kapitel17/daemon-sig-ex2.c b/kapitel17/daemon-sig-ex2.c new file mode 100644 index 0000000..fb21313 --- /dev/null +++ b/kapitel17/daemon-sig-ex2.c @@ -0,0 +1,125 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include +#include + +char pidfile[] = "/tmp/daemon-sig-ex.pid"; + +void sigHandler(int sig); +void shutDown(int sig); + +int main(void) +{ + pid_t process_id = 0; + pid_t sid = 0; + FILE *fp; + /* Skapa barn/child process */ + process_id = fork(); + + /* Hantera eventuellt fel vid fork() */ + if (process_id < 0) + { + fprintf(stderr, "fork misslyckades!\n"); + exit(1); + } + /* Avsluta förälderprocessen */ + else if (process_id > 0) + { + exit(1); + } + + /* Starta en ny session */ + sid = setsid(); + + if(sid < 0) + { + /* Avsluta ifall det inte gick att skapa en ny + session */ + fprintf(stderr, "Misslyckades att skapa en ny session\n"); + exit(1); + } + /* Gör en ny fork för att förhindra att demonen kan bli en + sessionsledare */ + process_id = fork(); + + /* Hantera eventuellt fel vid fork() */ + if (process_id < 0) + { + fprintf(stderr, "fork misslyckades!\n"); + exit(1); + } + /* Avsluta föräldern den eftersom allt arbete kommer att + utföras av demonen. Skriv också demonens PID-fil */ + else if (process_id > 0) + { + printf("Demonens PID: %d \n", process_id); + fp = fopen(pidfile, "w"); + fprintf(fp, "%d", process_id); + fclose(fp); + exit(0); + } + + /* Sätt umask till 022 (rw-r--r-- / rwx-r-xr-x) */ + umask(022); + + /* Ändra aktuell katalog till / */ + chdir("/"); + + /* Stäng stdin, stdout och stderr. Dessa behövs inte + i en demonprocess */ + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + open("/dev/null", O_RDONLY); /* 0 = stdin */ + open("/dev/null", O_WRONLY); /* 1 = stdout */ + open("/dev/null", O_RDWR); /* 2 = stderr */ + + /* Registrera signalhanterarna, en för varje signal + som vi vill fånga upp */ + signal(SIGUSR1, sigHandler); + signal(SIGTERM, sigHandler); + signal(SIGABRT, shutDown); + signal(SIGQUIT, shutDown); + signal(SIGINT, shutDown); + + /* Demonens arbete... */ + for(;;) + { + sleep(5); + } + return 0; +} + +void sigHandler(int sig) +{ + if (sig == SIGUSR1) + { + /* Skriv till syslog-demonen */ + syslog(LOG_DAEMON, "Tog emot SIGUSR1"); + } + else if (sig == SIGTERM) + { + /* Samma som ovan */ + syslog(LOG_DAEMON, "Tog emot SIGTERM"); + } + else + { + syslog(LOG_DAEMON, "Någonting hände med demonen..."); + } + /* Signalhanteraren återställs efter första signalen, + vi måste därför sätta den igen */ + signal(sig, sigHandler); +} + +void shutDown(int sig) +{ + syslog(LOG_DAEMON, "Demonen avslutas"); + /* Ta bort PID-filen */ + if ( unlink(pidfile) == -1 ) + syslog(LOG_DAEMON, "Kunde inte ta bort PID-filen"); + exit(0); +} diff --git a/kapitel17/fifo-client-ex1.c b/kapitel17/fifo-client-ex1.c new file mode 100644 index 0000000..9a526c5 --- /dev/null +++ b/kapitel17/fifo-client-ex1.c @@ -0,0 +1,20 @@ +#include +#include + +#define FIFONAM "/tmp/testfifo" + +int main(void) +{ + FILE *fp; + signed char c; + if ( access(FIFONAM, R_OK) != 0 ) + { + fprintf(stderr, "Problem att öppna %s\n", FIFONAM); + return 1; + } + fp = fopen(FIFONAM, "r"); + while ((c = getc(fp)) != EOF) + putchar(c); + fclose(fp); + return 0; +} diff --git a/kapitel17/fifo-ex1.c b/kapitel17/fifo-ex1.c new file mode 100644 index 0000000..5c2572a --- /dev/null +++ b/kapitel17/fifo-ex1.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define FIFONAM "/tmp/testfifo" + +/* Skapa fifofd i det globala scopet så att + vi kan stänga den ifrån signalhanteraren. */ +int fifofd; + +void cleanUp(int signum); + +int main(void) +{ + char msg[] = "Ett meddelande till klienterna\n"; + + /* Registrera signalhanterare för vanliga "avsluts-signaler" */ + signal(SIGINT, cleanUp); + signal(SIGQUIT, cleanUp); + signal(SIGABRT, cleanUp); + signal(SIGTERM, cleanUp); + /* Ignorera SIGPIPE, annars avslutas programmet när + mottagaren stängs */ + signal(SIGPIPE, SIG_IGN); + + /* Skapa FIFOn. S_IWUSR och S_IRUSR är detsamma som för + open() och creat() */ + if ( mkfifo(FIFONAM, S_IWUSR | S_IRUSR) != 0) + { + if (errno == EEXIST) + { + fprintf(stderr, "FIFOn finns redan, använder den\n"); + } + else + { + perror("mkfifo"); + return 1; + } + } + + /* Öppna FIFOn */ + fifofd = open(FIFONAM, O_WRONLY); + if (fifofd < 0) + { + perror("open"); + return 1; + } + + /* Skriv meddelanden i en oändlig loop */ + while(1) + { + write(fifofd, msg, sizeof(msg)); + sleep(1); /* Vänta en sekund mellan varje körning */ + } + /* Hit bör vi aldrig komma, men fall i fall så städar vi upp */ + unlink(FIFONAM); + close(fifofd); + return 0; +} + +void cleanUp(int signum) +{ + /* Stäng fildeskriptorn */ + if ( close(fifofd) == -1 ) + perror("cleanUp - close"); + + /* Radera FIFO-filen från systemet & avsluta programmet */ + if ( unlink(FIFONAM) == -1 ) + { + perror("cleanUp - unlink"); + exit(1); + } + exit(0); +} diff --git a/kapitel17/my-msg-recv.c b/kapitel17/my-msg-recv.c new file mode 100644 index 0000000..9d8e9cd --- /dev/null +++ b/kapitel17/my-msg-recv.c @@ -0,0 +1,45 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include + +#define MAX 100 + +int main(void) +{ + /* Struktur som krävs av msgsnd & msgrcv */ + struct msgbuf + { + long mtype; + char mtext[MAX]; + }; + + int id; + key_t key = 12345; + struct msgbuf msg; + msg.mtext[0] = '\0'; + + /* Kalla msgget för att få ett ID-nummer till kön. + Observera att vi här utelämnar IPC_CREAT. */ + if ( (id = msgget(key, 0660)) < 0 ) + { + fprintf(stderr, "Could not open message queue\n"); + perror("msgget"); + return 1; + } + + /* Ta emot meddelandet och spara det i msg */ + if ( msgrcv(id, &msg, MAX, 1, 0) < 0 ) + { + fprintf(stderr, "Could not receive messages\n"); + perror("msgrcv"); + return 1; + } + + /* Skriv ut meddelandet */ + printf("%s\n", msg.mtext); + + return 0; +} diff --git a/kapitel17/my-msg-send.c b/kapitel17/my-msg-send.c new file mode 100644 index 0000000..dfeb4a2 --- /dev/null +++ b/kapitel17/my-msg-send.c @@ -0,0 +1,53 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include + +#define MAX 100 + +int main(void) +{ + /* Struktur som krävs av msgsnd & msgrcv */ + struct msgbuf + { + long mtype; + char mtext[MAX]; + }; + + /* Variabler vi behöver */ + int id; + key_t key = 12345; + struct msgbuf msg; + size_t msglen; + msg.mtext[0] = '\0'; + + /* Kalla msgget för att få ett ID-nummer till kön. + IPC_CREAT är flaggan för att skapa en kö. 0660 + är rättigheterna för kön */ + if ( (id = msgget(key, IPC_CREAT | 0660)) < 0 ) + { + fprintf(stderr, "Could not create message queue\n"); + perror("msgget"); + return 1; + } + + /* Komponera ett testmeddelande. mtype är till för att + identifiera just detta meddelandet i kön. mtext är + det faktiska innehållet och msglen är längden på + meddelandet */ + msg.mtype = 1; + strcat(msg.mtext, "Hejsan svejsan"); + msglen = strlen(msg.mtext) + 1; + + /* Skicka meddelandet */ + if ( msgsnd(id, &msg, msglen, IPC_NOWAIT) < 0 ) + { + fprintf(stderr, "Could not send message\n"); + perror("msgsend"); + return 1; + } + + return 0; +} diff --git a/kapitel17/pipes-ex1.c b/kapitel17/pipes-ex1.c new file mode 100644 index 0000000..e92f9ea --- /dev/null +++ b/kapitel17/pipes-ex1.c @@ -0,0 +1,27 @@ +#include +#include +#include +#define MAX 7 + +int main(void) +{ + int pipefd[2]; + pid_t pid; + char line[MAX]; + + pipe(pipefd); + pid = fork(); + + if (pid > 0) + { + close(pipefd[0]); + write(pipefd[1], "Hejsan", MAX); + } + else + { + close(pipefd[1]); + read(pipefd[0], line, MAX); + printf("%s\n", line); + } + return 0; +} diff --git a/kapitel17/sig-client.c b/kapitel17/sig-client.c new file mode 100644 index 0000000..057b17c --- /dev/null +++ b/kapitel17/sig-client.c @@ -0,0 +1,61 @@ +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include + +void printUsage(char *arg); + +int main(int argc, char* argv[]) +{ + FILE *fp; + int opt; + pid_t process_id; + char pidfile[] = "/tmp/daemon-sig-ex.pid"; + + /* Kontrollera ifall PID-filen finns */ + if ( (fp = fopen(pidfile, "r")) == 0 ) + { + fprintf(stderr, "Ingen PID-fil, körs verkligen demonen?\n"); + return 1; + } + /* Läs in PID till process_id variabeln */ + fscanf(fp, "%d", &process_id); + + /* Om inga argument angavs, skriv ut demonens PID */ + if (argc == 1) + printf("Demonen körs med PID: %d\n", process_id); + + /* Behandla argument till programmet */ + while ((opt = getopt(argc, argv, "utqh")) != -1) + { + switch (opt) + { + case 'u': + kill(process_id, SIGUSR1); + break; + case 't': + kill(process_id, SIGTERM); + break; + case 'q': + kill(process_id, SIGQUIT); + break; + case 'h': + printUsage(argv[0]); + return 0; + default: + printUsage(argv[0]); + return 1; + } + } + return 0; +} + +void printUsage(char *arg) +{ + fprintf(stderr, "Usage: %s [-u] [-t] [-q] [-h]\n" + "-u = send SIGUSR1 to daemon\n" + "-t = send SIGTERM to daemon\n" + "-q = send SIGQUIT to quit the daemon\n" + "-h = display help\n", arg); +} diff --git a/kapitel17/unix-socket-client.c b/kapitel17/unix-socket-client.c new file mode 100644 index 0000000..1c2b049 --- /dev/null +++ b/kapitel17/unix-socket-client.c @@ -0,0 +1,48 @@ +#define _XOPEN_SOURCE 700 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define MAXLEN 32 + +int main(void) +{ + const char sockname[] = "/tmp/tidssocket"; + int fd; + struct sockaddr_un addr; + char recvbuffer[MAXLEN]; + + /* skapa en socket fildeskriptor */ + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if ( fd == -1 ) + { + perror("Create socket failed"); + return 1; + } + /* sätt adressfamiljen och socket-filen */ + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, sockname); + + /* anslut till servern */ + if ( (connect(fd, (const struct sockaddr*) &addr, + sizeof(struct sockaddr_un))) == -1 ) + { + perror("Can't connect"); + fprintf(stderr, "The server is down?\n"); + return 1; + } + /* läs tiden från servern */ + if ( (read(fd, recvbuffer, MAXLEN)) == -1 ) + { + perror("Can't read"); + return 1; + } + printf("Server time is: %s", recvbuffer); + write(fd, "Thank you for the time", 23); + return 0; +} diff --git a/kapitel17/unix-socket-server.c b/kapitel17/unix-socket-server.c new file mode 100644 index 0000000..1ce30e2 --- /dev/null +++ b/kapitel17/unix-socket-server.c @@ -0,0 +1,87 @@ +#define _XOPEN_SOURCE 700 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define MAXLEN 32 + +void cleanUp(int signum); +const char sockname[] = "/tmp/tidssocket"; +int connfd; +int datafd; + +int main(void) +{ + struct sockaddr_un addr; + char buffer[MAXLEN]; + char recvbuffer[MAXLEN]; + time_t current_time; + struct tm *local_time; + + /* registrera signalhanterarna */ + signal(SIGTERM, cleanUp); + signal(SIGABRT, cleanUp); + signal(SIGQUIT, cleanUp); + signal(SIGINT, cleanUp); + + /* skapa en socket fildeskriptor */ + connfd = socket(AF_UNIX, SOCK_STREAM, 0); + if ( connfd == -1 ) + { + perror("Create socket failed"); + return 1; + } + /* sätt adressfamiljen till UNIX-socket */ + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, sockname); + /* knyt ihop namnet och adressen och casta + sockaddr_un till sockaddr) */ + if ( (bind(connfd, (const struct sockaddr*)&addr, + sizeof(struct sockaddr_un))) == -1 ) + { + perror("Binding socket failed"); + return 1; + } + /* lyssna efter anslutningar */ + if ( (listen(connfd, 20)) == -1 ) + { + perror("Listen error"); + return 1; + } + + /* acceptera anslutningen, skapa en ny data-fildeskriptor, + och skicka tiden till klienten */ + while(1) + { + datafd = accept(connfd, NULL, NULL); + if (datafd == -1 ) + { + perror("Accept error"); + return 1; + } + printf("Client connected, sending time\n"); + current_time = time(NULL); + local_time = localtime(¤t_time); + strcpy(buffer, asctime(local_time)); + write(datafd, buffer, MAXLEN); + read(datafd, recvbuffer, MAXLEN); + printf("Client respons: %s\n", recvbuffer); + close(datafd); /* stäng datafd efter varje anrop */ + } + return 0; /* fall i fall */ +} + +void cleanUp(int signum) +{ + printf("Quitting and cleaning up\n"); + close(datafd); + close(connfd); + unlink(sockname); + exit(0); +} diff --git a/kapitel18/mygetip.c b/kapitel18/mygetip.c new file mode 100644 index 0000000..abedd90 --- /dev/null +++ b/kapitel18/mygetip.c @@ -0,0 +1,61 @@ +#define _XOPEN_SOURCE 700 +#include +#include +#include +#include +#include +#include +#include +#include +#define MAXSIZE 100 + +int main(int argc, char *argv[]) +{ + struct addrinfo hints, *res, *result; + char addrstr[MAXSIZE]; + char host[MAXSIZE]; + void *ptr; + + /* argument till programmet */ + if (argc == 2) + { + strncpy(host, argv[1], MAXSIZE); + } + else + { + printf("Please specify a host to lookup\n"); + return 1; + } + + memset (&hints, 0, sizeof (hints)); /* nolla ut hints */ + hints.ai_family = AF_UNSPEC; /* både IPv4 och IPv6 */ + hints.ai_socktype = SOCK_STREAM; + + /* hämta IP */ + if ( getaddrinfo (host, NULL, &hints, &result) != 0 ) + { + perror ("getaddrinfo"); + return 1; + } + + res = result; + + while (res) /* loopa över alla IP-adresser */ + { + switch (res->ai_family) /* IPv4 eller IPv6 */ + { + case AF_INET: /* IPv4 */ + ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr; + break; + case AF_INET6: /* IPv6 */ + ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr; + break; + } + /* omvandla binär-IP till läslig IP-adress */ + inet_ntop (res->ai_family, ptr, addrstr, MAXSIZE); + printf ("%s\n", addrstr); + res = res->ai_next; /* nästa IP i listan */ + } + freeaddrinfo(result); /* frigör minnet */ + return 0; +} diff --git a/kapitel18/tcp-client.c b/kapitel18/tcp-client.c new file mode 100644 index 0000000..9ef397a --- /dev/null +++ b/kapitel18/tcp-client.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAXLINE 1024 +#define SIZE 20 +int sockfd; + +void cleanUp(int signum); + +int main(int argc, char* argv[]) +{ + char ipaddr[SIZE] = "127.0.0.1"; + int port = 9000; + char buffer[MAXLINE]; + char message[MAXLINE]; + struct sockaddr_in servaddr; + int n; + socklen_t len; + + /* skapa socket-filen */ + if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) + { + perror("socket creation failed"); + return 1; + } + + /* kontrollera om vi angav en adress */ + if (argc == 2) + { + strncpy(ipaddr, argv[1], SIZE-1); + } + + /* registrera signalhanterarna */ + signal(SIGTERM, cleanUp); + signal(SIGABRT, cleanUp); + signal(SIGQUIT, cleanUp); + signal(SIGINT, cleanUp); + signal(SIGPIPE, cleanUp); + + /* nolla ut strukturen med adressen */ + memset(&servaddr, 0, sizeof(servaddr)); + + /* information om IP-adress och port */ + servaddr.sin_family = AF_INET; /* IPv4 */ + servaddr.sin_port = htons(port); + servaddr.sin_addr.s_addr = inet_addr(ipaddr);; + + len = sizeof(servaddr); /* storleken på adressen */ + + if (connect(sockfd, (struct sockaddr *)&servaddr, len) != 0) + { + perror("connect"); + return 1; + } + else + { + printf("Connected to the server..\n"); + } + + /* läs meddelanden och skicka till servern */ + while(1) + { + printf("Type your message: "); + fgets(message, sizeof(message), stdin); + /* byt ut radbrytningstecknet mot null */ + message[strcspn(message, "\n")] = '\0'; + /* skicka meddelandandet till servern med 'sendto' */ + write(sockfd, message, sizeof(message)); + /* ta emot meddelande från servern med 'recvfrom' */ + n = read(sockfd, buffer, sizeof(buffer)); + buffer[n] = '\0'; /* avsluta strängen med null */ + /* skriv ut svaret från servern */ + printf("Server: %s\n", buffer); + } + close(sockfd); + return 0; +} + +void cleanUp(int signum) +{ + printf("\nQuitting gracefully and closing the socket\n"); + close(sockfd); + exit(0); +} diff --git a/kapitel18/tcp-server.c b/kapitel18/tcp-server.c new file mode 100644 index 0000000..1dce5e2 --- /dev/null +++ b/kapitel18/tcp-server.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAXLINE 1024 +#define SIZE 20 +int sockfd; +int datafd; + +void cleanUp(int signum); + +int main(int argc, char* argv[]) +{ + char ipaddr[SIZE] = "127.0.0.1"; + int port = 9000; + char buffer[MAXLINE]; + char *confirmation = "Message received"; + struct sockaddr_in servaddr, cliaddr; + int n; + socklen_t len; + + /* skapa socket */ + if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) + { + perror("socket creation failed"); + return 1; + } + + /* kontrollera om vi angav en lyssnar-adress */ + if (argc == 2) + { + strncpy(ipaddr, argv[1], SIZE-1); + } + + /* registrera signalhanterarna */ + signal(SIGTERM, cleanUp); + signal(SIGABRT, cleanUp); + signal(SIGQUIT, cleanUp); + signal(SIGINT, cleanUp); + signal(SIGPIPE, cleanUp); /* när klienten kopplar från servern + får den en SIGPIPE */ + + /* nolla adress-strukturerna innan vi använder dem */ + memset(&servaddr, 0, sizeof(servaddr)); + memset(&cliaddr, 0, sizeof(cliaddr)); + + /* information om IP-adress och port */ + servaddr.sin_family = AF_INET; /* IPv4 */ + servaddr.sin_addr.s_addr = inet_addr(ipaddr); + servaddr.sin_port = htons(port); + + /* knyt ihop vår socket med adressen */ + if ( bind(sockfd, (const struct sockaddr *)&servaddr, + sizeof(servaddr)) < 0 ) + { + perror("bind"); + return 1; + } + + /* lyssna efter inkommande anslutningar */ + if ( (listen(sockfd, 5)) != 0 ) + { + perror("listen"); + return 1; + } + else + { + printf("Server listening...\n"); + } + len = sizeof(cliaddr); /* storleken på adressen */ + + /* acceptera inkommande anslutning */ + datafd = accept(sockfd, (struct sockaddr *)&cliaddr, &len); + if (datafd < 0) + { + perror("accept"); + return 1; + } + else + { + printf("Server accepted connection...\n"); + } + + /* ta emot paket och loopa tills klienten kopplar från */ + while(1) + { + n = read(datafd, buffer, sizeof(buffer)); + /* skriv ut meddelandet vi tog emot från klienten och + skicka en bekräftelse */ + buffer[n] = '\0'; /* avsluta strängen med null */ + printf("Client: %s\n", buffer); + write(datafd, confirmation, strlen(confirmation)+1); + printf("Confirmation message sent to client\n"); + } + /* vi når aldrig hit - men fall i fall */ + close(sockfd); + close(datafd); + return 0; +} + +void cleanUp(int signum) +{ + printf("Quitting gracefully and closing the socket\n"); + close(sockfd); + close(datafd); + exit(0); +} diff --git a/kapitel18/udp-client.c b/kapitel18/udp-client.c new file mode 100644 index 0000000..3dcfa05 --- /dev/null +++ b/kapitel18/udp-client.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAXLINE 1024 +#define SIZE 20 +int sockfd; + +void cleanUp(int signum); + +int main(int argc, char* argv[]) +{ + char ipaddr[SIZE] = "127.0.0.1"; + int port = 9000; + char buffer[MAXLINE]; + char message[MAXLINE]; + struct sockaddr_in servaddr; + int n; + socklen_t len; + + /* skapa socket-filen */ + if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) + { + perror("socket creation failed"); + return 1; + } + + /* kontrollera om vi angav en adress */ + if (argc == 2) + { + strncpy(ipaddr, argv[1], SIZE-1); + } + + /* registrera signalhanterarna */ + signal(SIGTERM, cleanUp); + signal(SIGABRT, cleanUp); + signal(SIGQUIT, cleanUp); + signal(SIGINT, cleanUp); + + /* nolla ut strukturen med adressen */ + memset(&servaddr, 0, sizeof(servaddr)); + + /* information om IP-adress och port */ + servaddr.sin_family = AF_INET; /* IPv4 */ + servaddr.sin_port = htons(port); + servaddr.sin_addr.s_addr = inet_addr(ipaddr);; + + len = sizeof(servaddr); /* storleken på adressen */ + + /* läs meddelanden och skicka till servern */ + while(1) + { + printf("Type your message: "); + fgets(message, sizeof(message), stdin); + /* byt ut radbrytningstecknet mot null */ + message[strcspn(message, "\n")] = '\0'; + /* skicka meddelandandet till servern med 'sendto' */ + sendto(sockfd, (const char *)message, strlen(message), + 0, (const struct sockaddr *) &servaddr, len); + + /* ta emot meddelande från servern med 'recvfrom' */ + n = recvfrom(sockfd, (char *)buffer, MAXLINE, + MSG_WAITALL, (struct sockaddr *) &servaddr, &len); + buffer[n] = '\0'; /* avsluta strängen med null */ + + /* skriv ut svaret från servern */ + printf("Server: %s\n", buffer); + } + /* vi når aldrig hit - men fall i fall */ + close(sockfd); + return 0; +} + +void cleanUp(int signum) +{ + printf("\nQuitting gracefully and closing the socket\n"); + close(sockfd); + exit(0); +} diff --git a/kapitel18/udp-server.c b/kapitel18/udp-server.c new file mode 100644 index 0000000..d82b0a5 --- /dev/null +++ b/kapitel18/udp-server.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAXLINE 1024 +#define SIZE 20 +int sockfd; + +void cleanUp(int signum); + +int main(int argc, char* argv[]) +{ + char ipaddr[SIZE] = "127.0.0.1"; + int port = 9000; + char buffer[MAXLINE]; + char *confirmation = "Message received"; + struct sockaddr_in servaddr, cliaddr; + int n; + socklen_t len; + + /* skapa socket */ + if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) + { + perror("socket creation failed"); + return 1; + } + + /* kontrollera om vi angav en lyssnar-adress */ + if (argc == 2) + { + strncpy(ipaddr, argv[1], SIZE-1); + } + + /* registrera signalhanterarna */ + signal(SIGTERM, cleanUp); + signal(SIGABRT, cleanUp); + signal(SIGQUIT, cleanUp); + signal(SIGINT, cleanUp); + + /* nolla adress-strukturerna innan vi använder dem */ + memset(&servaddr, 0, sizeof(servaddr)); + memset(&cliaddr, 0, sizeof(cliaddr)); + + /* information om IP-adress och port */ + servaddr.sin_family = AF_INET; /* IPv4 */ + servaddr.sin_addr.s_addr = inet_addr(ipaddr); + servaddr.sin_port = htons(port); + + /* knyt ihop vår socket med adressen */ + if ( bind(sockfd, (const struct sockaddr *)&servaddr, + sizeof(servaddr)) < 0 ) + { + perror("bind failed"); + return 1; + } + len = sizeof(cliaddr); /* storleken på adressen */ + + /* ta emot udp-paket och loopa för evigt */ + while(1) + { + n = recvfrom(sockfd, (char *)buffer, MAXLINE, + MSG_WAITALL, ( struct sockaddr *) &cliaddr, + &len); + buffer[n] = '\0'; /* avsluta strängen med null */ + + /* skriv ut meddelandet vi tog emot från klienten och skicka en + bekräftelse */ + printf("Client: %s\n", buffer); + sendto(sockfd, (const char *)confirmation, + strlen(confirmation), 0, + (const struct sockaddr *) &cliaddr, len); + printf("Confirmation message sent to client\n"); + } + /* vi når aldrig hit - men fall i fall */ + close(sockfd); + return 0; +} + +void cleanUp(int signum) +{ + printf("Quitting gracefully and closing the socket\n"); + close(sockfd); + exit(0); +} diff --git a/kapitel19/felsok-ex1.c b/kapitel19/felsok-ex1.c new file mode 100644 index 0000000..7ce3ab8 --- /dev/null +++ b/kapitel19/felsok-ex1.c @@ -0,0 +1,17 @@ +#include + +int main(void) +{ + int x; + int y = 5; + + char text[20] = "Hejsan"; + + for (x = 1; y < 100; x++) + { + y = (y*3)-x; + } + printf("%s\n", text); + + return 0; +} diff --git a/kapitel19/felsok-ex2.c b/kapitel19/felsok-ex2.c new file mode 100644 index 0000000..99f199a --- /dev/null +++ b/kapitel19/felsok-ex2.c @@ -0,0 +1,25 @@ +#include +#include + +float circum(float d); + +int main(int argc, char *argv[]) +{ + float di; + if (argc < 2) + { + fprintf(stderr, "Usage: %s diamater\n", argv[0]); + return 1; + } + + di = atof(argv[1]); + printf ("Circumference of a circle with a diamater %.2f is" + " %.2f\n", di, circum(di)); + return 0; +} + +float circum(float d) +{ + float pi = 3.14159265; + return (pi*d); +} diff --git a/kapitel19/flt-fel1.c b/kapitel19/flt-fel1.c new file mode 100644 index 0000000..af487d7 --- /dev/null +++ b/kapitel19/flt-fel1.c @@ -0,0 +1,23 @@ +#include +#include +#include + +char *say(char namn[]); + +int main(void) +{ + char *mening = say("Jack-Benny"); + printf("%s\n", mening); + free(mening); + printf("Lisa hojtar: %s\n", mening); + return 0; +} + +char *say(char namn[]) +{ + char *str; + str = calloc(50, sizeof(char)); + strncat(str, "Hej ", 4); + strncat(str, namn, 45); + return str; +} diff --git a/kapitel19/leak1.c b/kapitel19/leak1.c new file mode 100644 index 0000000..2c1b2ab --- /dev/null +++ b/kapitel19/leak1.c @@ -0,0 +1,14 @@ +#include +#include +#include + +int main(void) +{ + char* buffer; + buffer = malloc(sizeof(char)*15); + *buffer = '\0'; + strcpy(buffer, "Hejsan svejsan"); + printf("%s\n", buffer); + free(buffer); + return 0; +} diff --git a/kapitel19/oinitialiserat-ex1.c b/kapitel19/oinitialiserat-ex1.c new file mode 100644 index 0000000..517d716 --- /dev/null +++ b/kapitel19/oinitialiserat-ex1.c @@ -0,0 +1,11 @@ +#include +#include +#include + +int main(void) +{ + char* str; + strcat(str, "Hej alla"); + printf("%s\n", str); + return 0; +} diff --git a/kapitel19/undersoka-minne.c b/kapitel19/undersoka-minne.c new file mode 100644 index 0000000..f575d63 --- /dev/null +++ b/kapitel19/undersoka-minne.c @@ -0,0 +1,17 @@ +#include +#include +#include + +int main(void) +{ + char *a; + a = malloc(10*sizeof(char)); + *a = '\0'; + strcpy(a, "Hej hej"); + printf("Strängen %s\n", a); + *a = '\0'; + printf("Strängen %s\n", a); + + free(a); + return 0; +} diff --git a/kapitel4/helloworld.c b/kapitel4/helloworld.c new file mode 100644 index 0000000..4a42a83 --- /dev/null +++ b/kapitel4/helloworld.c @@ -0,0 +1,7 @@ +#include + +int main(void) +{ + printf("Hello world!\n"); + return 0; +} diff --git a/kapitel4/namn.c b/kapitel4/namn.c new file mode 100644 index 0000000..3449956 --- /dev/null +++ b/kapitel4/namn.c @@ -0,0 +1,10 @@ +#include + +int main(void) +{ + char namn[12]; + printf("Vad heter du? "); + scanf("%11s", namn); + printf("Hej %s, nu ska vi lära oss C!\n", namn); + return 0; +} diff --git a/kapitel4/namn_unsafe.c b/kapitel4/namn_unsafe.c new file mode 100644 index 0000000..2c27b1b --- /dev/null +++ b/kapitel4/namn_unsafe.c @@ -0,0 +1,10 @@ +#include + +int main(void) +{ + char namn[12]; + printf("Vad heter du? "); + scanf("%s", namn); + printf("Hej %s, nu ska vi lära oss C!\n", namn); + return 0; +} diff --git a/kapitel4/namn_v2.c b/kapitel4/namn_v2.c new file mode 100644 index 0000000..5b5d8e4 --- /dev/null +++ b/kapitel4/namn_v2.c @@ -0,0 +1,10 @@ +#include + +int main(void) +{ + char namn[12]; + printf("Vad heter du? "); + fgets(namn, sizeof(namn), stdin); + printf("Hej %s, nu ska vi lära oss C!\n", namn); + return 0; +} diff --git a/kapitel4/namn_v3.c b/kapitel4/namn_v3.c new file mode 100644 index 0000000..13edb88 --- /dev/null +++ b/kapitel4/namn_v3.c @@ -0,0 +1,13 @@ +#include +#include + +int main(void) +{ + char namn[12]; + printf("Vad heter du? "); + fgets(namn, sizeof(namn), stdin); + /* byt ut \n mot \0 på namn[index] */ + namn[strcspn(namn, "\n")] = '\0'; + printf("Hej %s, nu ska vi lära oss C!\n", namn); + return 0; +} diff --git a/kapitel4/testa-strcspn.c b/kapitel4/testa-strcspn.c new file mode 100644 index 0000000..365a133 --- /dev/null +++ b/kapitel4/testa-strcspn.c @@ -0,0 +1,11 @@ +#include +#include + +int main(void) +{ + int len; + char namn[6] = "Kalle"; + len = strcspn(namn, "e"); + printf("%d\n", len); + return 0; +} diff --git a/kapitel5/agg.c b/kapitel5/agg.c new file mode 100644 index 0000000..2314081 --- /dev/null +++ b/kapitel5/agg.c @@ -0,0 +1,9 @@ +#include + +int main(void) +{ + enum mangd { par = 2, dussin = 12, tjog = 20, + skock = 60 }; + printf("Kalle beställer %d ägg\n", dussin); + return 0; +} diff --git a/kapitel5/aritmetik-cast1.c b/kapitel5/aritmetik-cast1.c new file mode 100644 index 0000000..b93cc03 --- /dev/null +++ b/kapitel5/aritmetik-cast1.c @@ -0,0 +1,8 @@ +#include + +int main(void) +{ + printf("9 / 2 = %d\n", 9/2); + printf("9 / 2 = %f\n", (float)9/2); + return 0; +} diff --git a/kapitel5/aritmetik-cast2.c b/kapitel5/aritmetik-cast2.c new file mode 100644 index 0000000..7fc34dc --- /dev/null +++ b/kapitel5/aritmetik-cast2.c @@ -0,0 +1,9 @@ +#include + +int main(void) +{ + int x = 50; + int y = 9; + printf("%d / %d = %f\n", x, y, x/(float)y); + return 0; +} diff --git a/kapitel5/aritmetik1.c b/kapitel5/aritmetik1.c new file mode 100644 index 0000000..56c9c8d --- /dev/null +++ b/kapitel5/aritmetik1.c @@ -0,0 +1,20 @@ +#include + +int main(void) +{ + int a = 5; + float b = 7.5; + int c; + + printf("Heltalet: %d\n", a); + printf("Flyttalet: %f\n", b); + + /* Aritmetik med heltal och flyttal */ + printf("%d + %f = %f\n", a, b, (a+b)); + + /* Se upp, här skalas decimaltecknet bort! */ + c = (a+b); + printf("%d + %f = %d\n", a, b, c); + + return 0; +} diff --git a/kapitel5/aritmetik2.c b/kapitel5/aritmetik2.c new file mode 100644 index 0000000..8f203a1 --- /dev/null +++ b/kapitel5/aritmetik2.c @@ -0,0 +1,8 @@ +#include + +int main(void) +{ + printf("9 / 2 = %d\n", 9/2); + printf("9 / 2 = %f\n", 9.0/2); + return 0; +} diff --git a/kapitel5/bytes.c b/kapitel5/bytes.c new file mode 100644 index 0000000..fb9c653 --- /dev/null +++ b/kapitel5/bytes.c @@ -0,0 +1,10 @@ +#include + +int main(void) +{ + printf("En char: %lu byte\n", sizeof(char)); + printf("En vanlig int: %lu byte\n", sizeof(int)); + printf("En long int: %lu byte\n", sizeof(long int)); + printf("En short int: %lu byte\n", sizeof(short int)); + return 0; +} diff --git a/kapitel5/bytes_cast.c b/kapitel5/bytes_cast.c new file mode 100644 index 0000000..da2903b --- /dev/null +++ b/kapitel5/bytes_cast.c @@ -0,0 +1,14 @@ +#include + +int main(void) +{ + printf("En char: %lu byte\n", + (unsigned long int)sizeof(char)); + printf("En vanlig int: %lu byte\n", + (unsigned long int)sizeof(int)); + printf("En long int: %lu byte\n", + (unsigned long int)sizeof(long int)); + printf("En short int: %lu byte\n", + (unsigned long int)sizeof(short int)); + return 0; +} diff --git a/kapitel5/bytes_zu.c b/kapitel5/bytes_zu.c new file mode 100644 index 0000000..ceea8d6 --- /dev/null +++ b/kapitel5/bytes_zu.c @@ -0,0 +1,10 @@ +#include + +int main(void) +{ + printf("En char: %zu byte\n", sizeof(char)); + printf("En vanlig int: %zu byte\n", sizeof(int)); + printf("En long int: %zu byte\n", sizeof(long int)); + printf("En short int: %zu byte\n", sizeof(short int)); + return 0; +} diff --git a/kapitel5/casting-ex1.c b/kapitel5/casting-ex1.c new file mode 100644 index 0000000..d5f585b --- /dev/null +++ b/kapitel5/casting-ex1.c @@ -0,0 +1,22 @@ +#include + +int main(void) +{ + char c = 'A'; + float x = 3.14; + float y = 3.999; + int z = 45; + long int lx = 922337203685477580; + long int ly = 345; + int ii = 429496729; + + printf("Casta float %f till int: %d\n", x, (int)x); + printf("Casta float %f till int: %d\n", y, (int)y); + printf("Casta int %d till float: %f\n", z, (float)z); + printf("Casta char %c till int: %d\n", c, (int)c); + printf("Casta long int %li till int: %d\n", lx, (int)lx); + printf("Casta long int %li till int: %d\n", ly, (int)ly); + printf("Casta int %d till short int: %d\n", ii, (short int)ii); + + return 0; +} diff --git a/kapitel5/charint.c b/kapitel5/charint.c new file mode 100644 index 0000000..8670b7d --- /dev/null +++ b/kapitel5/charint.c @@ -0,0 +1,14 @@ +#include + +int main(void) +{ + char tecken = 'A'; + int x = 66; + int annat_tecken = 'C'; + + printf("%c = %d\n", tecken, tecken); + printf("%c = %d\n", x, x); + printf("%c = %d\n", annat_tecken, annat_tecken); + + return 0; +} diff --git a/kapitel5/const-int.c b/kapitel5/const-int.c new file mode 100644 index 0000000..cc77c5c --- /dev/null +++ b/kapitel5/const-int.c @@ -0,0 +1,9 @@ +#include + +int main(void) +{ + const int a = 10; + a = 15; + printf("a = %d\n", a); + return 0; +} diff --git a/kapitel5/flt.c b/kapitel5/flt.c new file mode 100644 index 0000000..c2aa030 --- /dev/null +++ b/kapitel5/flt.c @@ -0,0 +1,9 @@ +#include +#include + +int main(void) +{ + printf("Minsta möjliga float: %e\n", FLT_MIN); + printf("Största möjliga float: %e\n", FLT_MAX); + return 0; +} diff --git a/kapitel5/fmodtest.c b/kapitel5/fmodtest.c new file mode 100644 index 0000000..30af8ef --- /dev/null +++ b/kapitel5/fmodtest.c @@ -0,0 +1,11 @@ +#include +#include + +int main(void) +{ + float taljare = 19.5; + float namnare = 4.3; + printf("fmod(%0.1f, %0.1f) = %0.1f\n", taljare, namnare, + fmod(taljare,namnare)); + return 0; +} diff --git a/kapitel5/if-else-ex1.c b/kapitel5/if-else-ex1.c new file mode 100644 index 0000000..c98d0dd --- /dev/null +++ b/kapitel5/if-else-ex1.c @@ -0,0 +1,27 @@ +#include + +int main(void) +{ + int a = 5; + int b = 10; + + if (a < b) + { + printf ("%d är mindre än %d\n", a, b); + printf ("Uttrycket (%d < %d) ger talet: %d\n", a, b, (a + +int main(void) +{ + int a[8] = {1, 56, 39, 12, 9}; + printf("Objekt 0 = %d\n", a[0]); + printf("Objekt 1 = %d\n", a[1]); + printf("Objekt 2 = %d\n", a[2]); + printf("Objekt 3 = %d\n", a[3]); + printf("Objekt 4 = %d\n", a[4]); + printf("Objekt 5 = %d\n", a[5]); + printf("Objekt 6 = %d\n", a[6]); + printf("Objekt 7 = %d\n", a[7]); + return 0; +} diff --git a/kapitel5/konstant-tal.c b/kapitel5/konstant-tal.c new file mode 100644 index 0000000..b2dd442 --- /dev/null +++ b/kapitel5/konstant-tal.c @@ -0,0 +1,10 @@ +#include + +#define TAL 5 + +int main(void) +{ + #define TAL 1 + printf("Talet är: %d\n", TAL); + return 0; +} diff --git a/kapitel5/konstanter.c b/kapitel5/konstanter.c new file mode 100644 index 0000000..217af51 --- /dev/null +++ b/kapitel5/konstanter.c @@ -0,0 +1,11 @@ +#include +#define ETT_TAL 15 + +int main(void) +{ + const int annat_tal = 25; + printf ("%d\n", ETT_TAL); + printf ("%d\n", annat_tal); + + return 0; +} diff --git a/kapitel5/lager_v1.c b/kapitel5/lager_v1.c new file mode 100644 index 0000000..2542bd1 --- /dev/null +++ b/kapitel5/lager_v1.c @@ -0,0 +1,24 @@ +#include +#include + +int main(void) +{ + struct artikel + { + char namn[50]; + int antal; + float pris; + }; + + struct artikel lager; + + strcpy(lager.namn, "Skruv"); + lager.antal = 12; + lager.pris = 1.5; + + printf("Följande artiklar finns i lager\n\n"); + printf("Namn: %s\tAntal på lager: %d\tPris: %.2f\n", + lager.namn, lager.antal, lager.pris); + + return 0; +} diff --git a/kapitel5/lager_v2.c b/kapitel5/lager_v2.c new file mode 100644 index 0000000..e69f8fc --- /dev/null +++ b/kapitel5/lager_v2.c @@ -0,0 +1,38 @@ +#include +#include +#define ARTIKLAR 3 + +int main(void) +{ + struct artikel + { + char namn[50]; + int antal; + float pris; + }; + + struct artikel lager[ARTIKLAR]; + int i; + + strcpy(lager[0].namn, "Skruv"); + lager[0].antal = 12; + lager[0].pris = 1.5; + + strcpy(lager[1].namn, "Hammare"); + lager[1].antal = 2; + lager[1].pris = 159; + + strcpy(lager[2].namn, "Skruvmejsel"); + lager[2].antal = 5; + lager[2].pris = 79.90; + + printf("Följande artiklar finns i lager\n"); + printf("-------------------------------\n\n"); + for (i = 0; i +#include +#define ARTIKLAR 3 + +int main(void) +{ + typedef struct artikel + { + char namn[50]; + int antal; + float pris; + }ART; + + ART lager[ARTIKLAR]; + int i; + + strcpy(lager[0].namn, "Skruv"); + lager[0].antal = 12; + lager[0].pris = 1.5; + + strcpy(lager[1].namn, "Hammare"); + lager[1].antal = 2; + lager[1].pris = 159; + + strcpy(lager[2].namn, "Skruvmejsel"); + lager[2].antal = 5; + lager[2].pris = 79.90; + + printf("Följande artiklar finns i lager\n"); + printf("-------------------------------\n\n"); + for (i = 0; i + +int main(void) +{ + printf("%d\n", 7+8*3); + printf("%d\n", (7+8)*3); + + return 0; +} diff --git a/kapitel5/max_int.c b/kapitel5/max_int.c new file mode 100644 index 0000000..70454d8 --- /dev/null +++ b/kapitel5/max_int.c @@ -0,0 +1,9 @@ +#include +#include + +int main(void) +{ + printf("Maximal signed int: %d\n", INT_MAX); + printf("Maximal unsigned int: %u\n", UINT_MAX); + return 0; +} diff --git a/kapitel5/modulo-ex1.c b/kapitel5/modulo-ex1.c new file mode 100644 index 0000000..c339d0e --- /dev/null +++ b/kapitel5/modulo-ex1.c @@ -0,0 +1,12 @@ +#include + +int main(void) +{ + printf("%d / %d = %d\n", 3, 2, 3/2); + printf("%d %% %d = %d\n\n", 3, 2, 3%2); + + printf("%d / %d = %d\n", 13, 4, 13/4); + printf("%d %% %d = %d\n", 13, 4, 13%4); + + return 0; +} diff --git a/kapitel5/struct-test.c b/kapitel5/struct-test.c new file mode 100644 index 0000000..7750a46 --- /dev/null +++ b/kapitel5/struct-test.c @@ -0,0 +1,28 @@ +#include + +int main(void) +{ + struct test1 + { + short int a; /* 2 bytes */ + /* 2 bytes utfyllnad (2+2=4) */ + int b; /* 4 bytes (4) */ + char c; /* 1 byte */ + char d; /* 1 byte */ + /* 2 bytes utfyllnad (1+1+2=4) */ + }; + + struct test2 + { + int b; /* 4 bytes (4) */ + char c; /* 1 bytes */ + char d; /* 1 bytes */ + short int a; /* 2 bytes (1+1+2=4) */ + }; + + printf("Storleken av test1: %lu bytes\n", + (long unsigned int)sizeof(struct test1)); + printf("Storleken av test2: %lu bytes\n", + (long unsigned int)sizeof(struct test2)); + return 0; +} diff --git a/kapitel5/type-demo.c b/kapitel5/type-demo.c new file mode 100644 index 0000000..409d81b --- /dev/null +++ b/kapitel5/type-demo.c @@ -0,0 +1,27 @@ +#include +#include + +int main(void) +{ + typedef char text[50]; /* Nytt alias 'text' för char[50] */ + typedef char tiny; /* Nytt alias 'tiny' för char */ + + text namn; + text adress; + text ort = "Ankeborg"; + tiny knattarna = 3; + + printf("Vad heter du? "); + fgets(namn, sizeof(text), stdin); + printf("Vilken gatuadress bor du på? "); + fgets(adress, sizeof(text), stdin); + namn[strcspn(namn, "\n")] = '\0'; + adress[strcspn(adress, "\n")] = '\0'; + + printf("En 'text' är %lu tecken stor.\n", + (unsigned long int)sizeof(text)); + printf("Hej %s, från %s %s.\n", namn, adress, ort); + printf("Knattarna är %d st.\n", knattarna); + + return 0; +} diff --git a/kapitel5/uniontest.c b/kapitel5/uniontest.c new file mode 100644 index 0000000..f4bad96 --- /dev/null +++ b/kapitel5/uniontest.c @@ -0,0 +1,23 @@ +#include +#include +int main(void) +{ + union myUnion /* Samma syntax som för struct */ + { + int x; + float y; + char z[20]; + } unionTest; /* Skapar en variabel unionTest ur myUnion */ + + printf("Storleken är %lu bytes\n", + (unsigned long int)sizeof(unionTest)); + + /* Endast unionTest.z nedan kommer innehålla ett riktigt värde */ + unionTest.x = 500; + unionTest.y = 3.14; + strcpy(unionTest.z, "Hej hopp!"); + printf("x = %d\ny = %f\nz = %s\n", unionTest.x, unionTest.y, + unionTest.z); + + return 0; +} diff --git a/kapitel5/uniontest_v2.c b/kapitel5/uniontest_v2.c new file mode 100644 index 0000000..60b7fc4 --- /dev/null +++ b/kapitel5/uniontest_v2.c @@ -0,0 +1,25 @@ +#include +#include + +int main(void) +{ + union myUnion /* Samma syntax som för struct */ + { + int x; + float y; + char z[20]; + } unionTest; /* Skapar en variabel unionTest ur myUnion */ + + printf("Storleken är %lu bytes\n", + (long unsigned int)sizeof(unionTest)); + + /* Här arbetar vi med en medlem i taget, helt korrekt */ + unionTest.x = 500; + printf("x = %d\n", unionTest.x); + unionTest.y = 3.14; + printf("y = %f\n", unionTest.y); + strcpy(unionTest.z, "Hej hopp!"); + printf("z = %s\n", unionTest.z); + + return 0; +} diff --git a/kapitel5/unsignedtest.c b/kapitel5/unsignedtest.c new file mode 100644 index 0000000..607cc9b --- /dev/null +++ b/kapitel5/unsignedtest.c @@ -0,0 +1,13 @@ +#include +#include + +int main(void) +{ + unsigned int i; + for (i = 10; i >= 0; i--) + { + printf("%u\n", i); + sleep(1); + } + return 0; +} diff --git a/kapitel5/veckodagar.c b/kapitel5/veckodagar.c new file mode 100644 index 0000000..1a1b398 --- /dev/null +++ b/kapitel5/veckodagar.c @@ -0,0 +1,20 @@ +#include + +int main(void) +{ + int idag; + enum veckodag { mandag = 1, tisdag, onsdag, + torsdag, fredag, lordag, sondag }; + idag = onsdag; + + if ( idag == lordag || idag == sondag ) + { + printf("Idag är det helg\n"); + } + else + { + printf("Idag är det vardag\n"); + } + + return 0; +} diff --git a/kapitel6/break-ex1.c b/kapitel6/break-ex1.c new file mode 100644 index 0000000..f737382 --- /dev/null +++ b/kapitel6/break-ex1.c @@ -0,0 +1,15 @@ +#include + +int main(void) +{ + int i; + + for(i=10; i>0; i--) + { + printf("i = %d\n", i); + if (i==4) + break; + } + + return 0; +} diff --git a/kapitel6/break-ex2.c b/kapitel6/break-ex2.c new file mode 100644 index 0000000..ced77cc --- /dev/null +++ b/kapitel6/break-ex2.c @@ -0,0 +1,21 @@ +#include + +int main(void) +{ + int i; + int j; + + for(i=10; i>0; i--) + { + printf("i = %d\n", i); + for (j=30; j<=40; j++) + { + printf("j = %d\n", j); + if (j==33) + { + break; + } + } + } + return 0; +} diff --git a/kapitel6/break-ex3.c b/kapitel6/break-ex3.c new file mode 100644 index 0000000..4761402 --- /dev/null +++ b/kapitel6/break-ex3.c @@ -0,0 +1,14 @@ +#include + +int main(void) +{ + int i = 10; + while (i>0) + { + printf ("i = %d\n", i); + if (i == 6) + break; + i--; + } + return 0; +} diff --git a/kapitel6/c99-for-loop.c b/kapitel6/c99-for-loop.c new file mode 100644 index 0000000..c1ad736 --- /dev/null +++ b/kapitel6/c99-for-loop.c @@ -0,0 +1,20 @@ +#include + +int main(void) +{ + for (int i=0; i<=10; i++) + printf("i = %d\n", i); + + /* Nedanstående printf()-rad fungerar inte eftersom i är lokal + för for-loopen ovan. Testa genom att av-kommentera raden */ + /* printf("Utanför loopen är i = %d\n", i); */ + + int j; + for (j=10; j>=0; j--) + printf("j = %d\n", j); + + /* Detta kommer dock att fungera eftersom j deklarerades + utanför for-loopen */ + printf("Utanför loopen är j = %d\n", j); + return 0; +} diff --git a/kapitel6/cmp-strings.c b/kapitel6/cmp-strings.c new file mode 100644 index 0000000..604aeea --- /dev/null +++ b/kapitel6/cmp-strings.c @@ -0,0 +1,21 @@ +#include +#include + +int main(void) +{ + char a[] = "Kalle"; + char b[] = "Lisa"; + + /* Skriver ut adressen till "Hej" */ + printf("%lu\n", (long unsigned int)"Hej"); + + /* Jämför strängar */ + if(strcmp(a, b) == 0) + printf("%s och %s är detsamma\n", a, b); + else if(strcmp(a, "Kalle") == 0) + printf("%s = Kalle\n", a); + else + printf("Ingen match\n"); + + return 0; +} diff --git a/kapitel6/continue-ex1.c b/kapitel6/continue-ex1.c new file mode 100644 index 0000000..478fa30 --- /dev/null +++ b/kapitel6/continue-ex1.c @@ -0,0 +1,13 @@ +#include + +int main(void) +{ + int i; + for (i=1; i<=10; i++) + { + if(i%2 == 0) + continue; + printf ("i = %d\n", i); + } + return 0; +} diff --git a/kapitel6/do-while-ex1.c b/kapitel6/do-while-ex1.c new file mode 100644 index 0000000..b4cfed2 --- /dev/null +++ b/kapitel6/do-while-ex1.c @@ -0,0 +1,14 @@ +#include + +int main(void) +{ + int x = 5; + + do + { + x++; + printf("X är nu: %d\n", x); + } while (x < 5); + + return 0; +} diff --git a/kapitel6/elseif-ex1.c b/kapitel6/elseif-ex1.c new file mode 100644 index 0000000..8a43755 --- /dev/null +++ b/kapitel6/elseif-ex1.c @@ -0,0 +1,21 @@ +#include + +int main(void) +{ + int a = 5; + int b = 10; + int c = 15; + + if (a > b) + printf("%d är större än %d\n", a, b); + else if (a > c) + printf("%d är större än %d\n", a, c); + else if (a == b) + printf("%d är lika stor som %d\n", a, b); + else + printf("Inget av de ovanstående villkoren var sanna\n"); + + printf("Här fortsätter koden som vanligt\n"); + + return 0; +} diff --git a/kapitel6/elseif-ex2.c b/kapitel6/elseif-ex2.c new file mode 100644 index 0000000..7b387a6 --- /dev/null +++ b/kapitel6/elseif-ex2.c @@ -0,0 +1,15 @@ +#include + +int main(void) +{ + int a = 10; + int b = 15; + + if (a < 20) + printf("Detta är den enda raden som kommer skrivas ut\n"); + else if (b < 20) + printf("Jag är också sann, men kommer inte skrivas ut\n"); + else + printf("Jag kommer inte heller skrivas ut...\n"); + return 0; +} diff --git a/kapitel6/enkelt-losenord.c b/kapitel6/enkelt-losenord.c new file mode 100644 index 0000000..ab29537 --- /dev/null +++ b/kapitel6/enkelt-losenord.c @@ -0,0 +1,16 @@ +#include +#include + +int main(void) +{ + char guess[10]; + char pass[] = "kalle"; + while (strcmp(guess, pass)) + { + printf("Skriv in lösenordet: "); + fgets(guess, sizeof(guess), stdin); + guess[strcspn(guess, "\n")] = '\0'; + } + printf("Du lyckades!\n"); + return 0; +} diff --git a/kapitel6/for-uteslut-ex1.c b/kapitel6/for-uteslut-ex1.c new file mode 100644 index 0000000..259e619 --- /dev/null +++ b/kapitel6/for-uteslut-ex1.c @@ -0,0 +1,13 @@ +#include + +int main(void) +{ + int i = 6; + i = i * 2; + + for ( ; i>0; i--) + { + printf("i = %d\n", i); + } + return 0; +} diff --git a/kapitel6/if-ex1.c b/kapitel6/if-ex1.c new file mode 100644 index 0000000..4efb8e0 --- /dev/null +++ b/kapitel6/if-ex1.c @@ -0,0 +1,13 @@ +#include + +int main(void) +{ + int a = 5; + int b = 10; + + if (a < b) + { + printf ("%d är mindre än %d\n", a, b); + } + return 0; +} diff --git a/kapitel6/if-ex2.c b/kapitel6/if-ex2.c new file mode 100644 index 0000000..8efe5b4 --- /dev/null +++ b/kapitel6/if-ex2.c @@ -0,0 +1,11 @@ +#include + +int main(void) +{ + int a = 5; + int b = 10; + + if (a < b) + printf ("%d är mindre än %d\n", a, b); + return 0; +} diff --git a/kapitel6/if-ex3.c b/kapitel6/if-ex3.c new file mode 100644 index 0000000..b3dbf77 --- /dev/null +++ b/kapitel6/if-ex3.c @@ -0,0 +1,8 @@ +#include + +int main(void) +{ + if (5 == (3+2)) + printf("5 är detsamma som 3+2\n"); + return 0; +} diff --git a/kapitel6/logiskt.c b/kapitel6/logiskt.c new file mode 100644 index 0000000..6e13ca9 --- /dev/null +++ b/kapitel6/logiskt.c @@ -0,0 +1,17 @@ +#include + +int main(void) +{ + /* Ger sant om antingen 4 > 5, eller om 5 < 10, + eller om både 4 > 5 och 5 < 10. Minst ett utav + villkoren måste således vara uppfyllda. */ + if (4 > 5 || 5 < 10) + printf("4 > 5 eller 5 < 10\n"); + + /* Ger sant om både 4 > 5 och 5 < 10, annars inte. + Båda villkoren måste således vara uppfyllda. */ + if (4 > 5 && 5 < 10) + printf("4 > 5 och 5 < 10\n"); + + return 0; +} diff --git a/kapitel6/oandlig-loop.c b/kapitel6/oandlig-loop.c new file mode 100644 index 0000000..d39ed5c --- /dev/null +++ b/kapitel6/oandlig-loop.c @@ -0,0 +1,10 @@ +#include + +int main(void) +{ + for (;;) + { + printf("En oändlig loop\n"); + } + return 0; +} diff --git a/kapitel6/rakna-upp.c b/kapitel6/rakna-upp.c new file mode 100644 index 0000000..f1258a5 --- /dev/null +++ b/kapitel6/rakna-upp.c @@ -0,0 +1,13 @@ +#include + +int main(void) +{ + int i; + + for (i=0; i<=10; i++) + { + printf("i = %d\n", i); + } + + return 0; +} diff --git a/kapitel6/tecken.c b/kapitel6/tecken.c new file mode 100644 index 0000000..a8c3994 --- /dev/null +++ b/kapitel6/tecken.c @@ -0,0 +1,12 @@ +#include + +int main(void) +{ + char tecken; + + if ((tecken = getchar()) == 10) + printf ("Inget tecken angavs\n"); + else + printf("Tecknet är: %c\n", tecken); + return 0; +} diff --git a/kapitel6/tecken_v2.c b/kapitel6/tecken_v2.c new file mode 100644 index 0000000..c5e0f85 --- /dev/null +++ b/kapitel6/tecken_v2.c @@ -0,0 +1,26 @@ +#include + +int main(void) +{ + char tecken; + + if ((tecken = getchar()) == 10) + printf ("Inget tecken angavs\n"); + else + { + printf("Tecknet är: %c\n", tecken); + if (tecken == 'A') + { + printf ("Du skrev ett versalt A\n"); + } + else if (tecken == 'a') + { + printf("Du skrev ett gement a\n"); + } + else + { + printf("Du skrev något tecken, förutom A eller a\n"); + } + } + return 0; +} diff --git a/kapitel6/tecken_v3.c b/kapitel6/tecken_v3.c new file mode 100644 index 0000000..90a8632 --- /dev/null +++ b/kapitel6/tecken_v3.c @@ -0,0 +1,22 @@ +#include + +int main(void) +{ + char tecken; + + if ((tecken = getchar()) == 10) + printf ("Inget tecken angavs\n"); + else + { + printf("Tecknet är: %c\n", tecken); + if ((tecken >= 65) && (tecken <= 90)) + printf("Det är dessutom en versal bokstav\n"); + else if ((tecken >= 97) && (tecken <= 122)) + printf("Det är dessutom en gemen bokstav\n"); + else if ((tecken >= 48) && (tecken <= 57)) + printf("Det är en siffra\n"); + else + printf("Tecknet är ingen bokstav och ingen siffra\n"); + } + return 0; +} diff --git a/kapitel6/veckodag.c b/kapitel6/veckodag.c new file mode 100644 index 0000000..4769510 --- /dev/null +++ b/kapitel6/veckodag.c @@ -0,0 +1,41 @@ +#include + +int main(void) +{ + int d; + + printf("Ange veckodag (1-7): "); + scanf("%d", &d); + + /* Kontrollera först om veckodagen är giltig */ + if((d<0) || (d>7)) + { + printf("Ogiltig veckodag, ange ett tal mellan 1-7\n"); + return 1; /* Avsluta programmet med returkod 1 + ifall veckodagen utanför 1-7 */ + } + + /* Nu använder vi switch för att behandla veckodagen */ + switch (d) + { + case(1): + printf("Början på veckan\n"); + break; + case(2): + printf("Tisdag\n"); + break; + case(5): + printf("Fredag!\n"); + break; + case(6): + printf("Lördag, det är helg!!\n"); + break; + case(7): + printf("Söndag, det är fortfarande helg!!\n"); + break; + default: + printf("Mitten av veckan...\n"); + break; + } + return 0; +} diff --git a/kapitel6/while-ex1.c b/kapitel6/while-ex1.c new file mode 100644 index 0000000..3c0c37d --- /dev/null +++ b/kapitel6/while-ex1.c @@ -0,0 +1,13 @@ +#include + +int main(void) +{ + int i = 10; + while (i>0) + { + printf ("i = %d\n", i); + i--; + } + + return 0; +} diff --git a/kapitel6/while-ex2.c b/kapitel6/while-ex2.c new file mode 100644 index 0000000..21e5d72 --- /dev/null +++ b/kapitel6/while-ex2.c @@ -0,0 +1,14 @@ +#include + +int main(void) +{ + int x = 5; + + while (x < 5) + { + x++; + printf("X är nu: %d\n", x); + } + + return 0; +} diff --git a/kapitel7/bitvis-negation-ex1.c b/kapitel7/bitvis-negation-ex1.c new file mode 100644 index 0000000..1357d99 --- /dev/null +++ b/kapitel7/bitvis-negation-ex1.c @@ -0,0 +1,13 @@ +#include + +int main(void) +{ + unsigned char a = 140; /* 1000 1100 */ + unsigned char b; + + b = ~a; + + printf("b = %d\n", b); /* 0111 0011 */ + + return 0; +} diff --git a/kapitel7/bitvis-negation-signerad.c b/kapitel7/bitvis-negation-signerad.c new file mode 100644 index 0000000..a70331d --- /dev/null +++ b/kapitel7/bitvis-negation-signerad.c @@ -0,0 +1,9 @@ +#include +int main(void) +{ + int a = 140; /* 0 1000 1100 */ + int b; + b = ~a; + printf("b = %d\n", b); /* 1 0111 0011 */ + return 0; +} diff --git a/kapitel7/bitvis-skift-ex1.c b/kapitel7/bitvis-skift-ex1.c new file mode 100644 index 0000000..d5c421f --- /dev/null +++ b/kapitel7/bitvis-skift-ex1.c @@ -0,0 +1,17 @@ +#include + +int main(void) +{ + unsigned char a = 16; /* 00010000 */ + + printf("%d\n", (a = a >> 1)); /* 8 = 00001000 */ + printf("%d\n", (a = a >> 1)); /* 4 = 00000100 */ + printf("%d\n", (a = a >> 2)); /* 1 = 00000001 */ + + printf("%d\n", (a = a << 1)); /* 2 = 00000010 */ + printf("%d\n", (a = a << 4)); /* 32 = 00100000 */ + printf("%d\n", (a = a << 1)); /* 64 = 01000000 */ + printf("%d\n", (a = a << 1)); /* 128 = 10000000 */ + + return 0; +} diff --git a/kapitel7/bitwise-and-or-ex1.c b/kapitel7/bitwise-and-or-ex1.c new file mode 100644 index 0000000..fd937f7 --- /dev/null +++ b/kapitel7/bitwise-and-or-ex1.c @@ -0,0 +1,16 @@ +#include + +int main(void) +{ + unsigned char a = 12; /* 0000 1100 */ + unsigned char b = 9; /* 0000 1001 */ + unsigned char c, d; + + c = a & b; + d = a | b; + + printf("OCH = %d\n", c); + printf("ELLER = %d\n", d); + + return 0; +} diff --git a/kapitel7/bitwise-and-or-ex2.c b/kapitel7/bitwise-and-or-ex2.c new file mode 100644 index 0000000..32d67f7 --- /dev/null +++ b/kapitel7/bitwise-and-or-ex2.c @@ -0,0 +1,14 @@ +#include + +int main(void) +{ + unsigned char a = 12; /* 0000 1100 */ + unsigned char b = 9; /* 0000 1001 */ + + if((a & b) == 8) + printf("Korrekt, talet blir åtta\n"); + if((a | b) == 13) + printf("Korrekt, talet blir tretton\n"); + + return 0; +} diff --git a/kapitel7/bitwise-and-or-ex3.c b/kapitel7/bitwise-and-or-ex3.c new file mode 100644 index 0000000..337a277 --- /dev/null +++ b/kapitel7/bitwise-and-or-ex3.c @@ -0,0 +1,11 @@ +#include + +int main(void) +{ + unsigned char x = 211; /* 1101 0011 */ + + if (x & 64) + printf("Den andra biten från vänster är satt\n"); + + return 0; +} diff --git a/kapitel7/bitwise-and-or-ex4.c b/kapitel7/bitwise-and-or-ex4.c new file mode 100644 index 0000000..76bde59 --- /dev/null +++ b/kapitel7/bitwise-and-or-ex4.c @@ -0,0 +1,13 @@ +#include + +int main(void) +{ + unsigned char a = 128; + unsigned char b; + + b = a | 1; + + printf("b = %d\n", b); + + return 0; +} diff --git a/kapitel7/exklusiv-eller.c b/kapitel7/exklusiv-eller.c new file mode 100644 index 0000000..1e03f8c --- /dev/null +++ b/kapitel7/exklusiv-eller.c @@ -0,0 +1,13 @@ +#include + +int main(void) +{ + unsigned char a = 147; + unsigned char b; + + b = a ^ 17; + + printf("b = %d\n", b); + + return 0; +} diff --git a/kapitel8/arsiffra.c b/kapitel8/arsiffra.c new file mode 100644 index 0000000..bb61f98 --- /dev/null +++ b/kapitel8/arsiffra.c @@ -0,0 +1,18 @@ +#include + +int arsiffra(char c) +{ + if ((c >= '0') && (c <= '9')) + return 1; + else + return 0; +} + +int main(void) +{ + char chr1 = '9'; + char chr2 = 'a'; + printf("chr1: %d\n", arsiffra(chr1)); + printf("chr2: %d\n", arsiffra(chr2)); + return 0; +} diff --git a/kapitel8/arsiffra_v2.c b/kapitel8/arsiffra_v2.c new file mode 100644 index 0000000..a26ecc0 --- /dev/null +++ b/kapitel8/arsiffra_v2.c @@ -0,0 +1,22 @@ +#include + +int arsiffra(char); /* Funktionsprototyp */ + +int main(void) +{ + char chr1 = '9'; + char chr2 = 'a'; + printf("chr1: %d\n", arsiffra(chr1)); + printf("chr2: %d\n", arsiffra(chr2)); + return 0; +} + +/* Här följer funktionskroppen för + funktionen arsiffra() */ +int arsiffra(char c) +{ + if ((c >= '0') && (c <= '9')) + return 1; + else + return 0; +} diff --git a/kapitel8/callbyvalue.c b/kapitel8/callbyvalue.c new file mode 100644 index 0000000..e0ac366 --- /dev/null +++ b/kapitel8/callbyvalue.c @@ -0,0 +1,18 @@ + #include + + int kvadrat(int x); + + int main(void) + { + int z = 5; + printf("z = %d\n", z); + printf("Kvadraten på z = %d\n", kvadrat(z)); + printf("z = %d\n", z); + return 0; + } + + int kvadrat(int x) + { + x = x * x; + return x; + } diff --git a/kapitel8/digit-test.c b/kapitel8/digit-test.c new file mode 100644 index 0000000..7898c2f --- /dev/null +++ b/kapitel8/digit-test.c @@ -0,0 +1,11 @@ +#include +#include + +int main(void) +{ + char chr1 = '9'; + char chr2 = 'a'; + printf("chr1: %d\n", isdigit(chr1)); + printf("chr2: %d\n", isdigit(chr2)); + return 0; +} diff --git a/kapitel8/omkrets.c b/kapitel8/omkrets.c new file mode 100644 index 0000000..d10827e --- /dev/null +++ b/kapitel8/omkrets.c @@ -0,0 +1,18 @@ +#include + +float omkrets(float diameter); + +int main(void) +{ + float d = 15; + float o = omkrets(d); + printf("Omkretsen för en cirkel med diametern " + "%.3f är %.3f\n", d, o); + return 0; +} + +float omkrets(float diameter) +{ + float pi = 3.14159265; + return (pi * diameter); +} diff --git a/kapitel8/primtal.c b/kapitel8/primtal.c new file mode 100644 index 0000000..18ea4d5 --- /dev/null +++ b/kapitel8/primtal.c @@ -0,0 +1,26 @@ +#include +#include "skrivprm.h" + +int main(void) +{ + int min; + int max; + + printf("Ange minsta talet: "); + if(!scanf("%d", &min)) + { + printf("Ange endast heltal\n"); + return 1; + } + + printf("Ange största talet: "); + if(!scanf("%d", &max)) + { + printf("Ange endast heltal\n"); + return 1; + } + + skrivprimtal(min, max); + + return 0; +} diff --git a/kapitel8/primtalsprogram.c b/kapitel8/primtalsprogram.c new file mode 100644 index 0000000..be1acd9 --- /dev/null +++ b/kapitel8/primtalsprogram.c @@ -0,0 +1,34 @@ +#include + +void skrivprimtal(int min, int max); + +int main(void) +{ + int a = 2; + int b = 30; + printf("Alla primtal mellan %d och %d\n", a, b); + skrivprimtal(a, b); + return 0; +} + + +void skrivprimtal(int min, int max) +{ + int i, j, primtal; + for (i=min; i<=max; i++) + { + primtal = 1; + for(j=2; j + +void skrivprimtal(int min, int max) +{ + int i, j, primtal; + for (i=min; i<=max; i++) + { + primtal = 1; + for(j=2; j + +void funk1(void); + +int main(void) +{ + int i = 555; + int x = 123; + printf("i utanför for: %d\n", i); + + for (int i = 0; i <= 2; i++) + { + printf("i inuti for: %d\n", i); + printf("x går att nå ifrån loopen och är: %d\n", x); + } + + printf("i utanför och efter for: %d\n", i); + funk1(); + printf("i i main är fortfarande: %d\n", i); + return 0; +} + +void funk1(void) +{ + int i = 999; + printf("i inuti funk1: %d\n", i); +} diff --git a/kapitel9/block-scope-ex2.c b/kapitel9/block-scope-ex2.c new file mode 100644 index 0000000..93b2eff --- /dev/null +++ b/kapitel9/block-scope-ex2.c @@ -0,0 +1,20 @@ +#include + +int main(void) +{ + int i = 10; + + for (int i = 0; i <= 3; i++) + { + printf("i inuti första for: %d\n", i); + } + + printf("i utanför for: %d\n", i); + + for ( ; i<= 13; i++) + { + printf("i inuti andra for: %d\n", i); + } + + return 0; +} diff --git a/kapitel9/calloc-ex1.c b/kapitel9/calloc-ex1.c new file mode 100644 index 0000000..326dee0 --- /dev/null +++ b/kapitel9/calloc-ex1.c @@ -0,0 +1,20 @@ +#include +#include +#include + +int main(void) +{ + char *a, *b; + a = calloc(30, sizeof(char)); + + strcat(a, "hej hej"); + printf("%s\n", a); + free(a); + + b = calloc(30, sizeof(char)); + strcat(b, "hej igen"); + printf("%s\n", b); + free(b); + + return 0; +} diff --git a/kapitel9/forsta-tecknet.c b/kapitel9/forsta-tecknet.c new file mode 100644 index 0000000..20a480a --- /dev/null +++ b/kapitel9/forsta-tecknet.c @@ -0,0 +1,30 @@ +#include +#include +#include +#define SIZE 20 + +int main(void) +{ + char *a; + int i; + a = calloc(SIZE, sizeof(char)); + strcpy(a, "Hej alla glada"); + + printf("Strängen: %s\n", a); + + *a = '\0'; /* "Initialisera" igen */ + printf("Strängen efter ny initialisering: %s\n", a); + + printf("\nTecken för tecken efter ny initialisering:\n"); + for (i=0; i + +extern int x; + +int main(void) +{ + printf("x = %d\n", x); + return 0; +} diff --git a/kapitel9/fungerande-scope-fil2.c b/kapitel9/fungerande-scope-fil2.c new file mode 100644 index 0000000..2a1b8e7 --- /dev/null +++ b/kapitel9/fungerande-scope-fil2.c @@ -0,0 +1,2 @@ +int x = 5; +static int y = 10; diff --git a/kapitel9/global-ex1.c b/kapitel9/global-ex1.c new file mode 100644 index 0000000..114f46a --- /dev/null +++ b/kapitel9/global-ex1.c @@ -0,0 +1,19 @@ +#include + +void funk(void); + +int x = 5; + +int main(void) +{ + printf("x = %d\n", x); + printf("++x = %d\n", ++x); + funk(); + printf("++x = %d\n", ++x); + return 0; +} + +void funk(void) +{ + printf("++x = %d\n", ++x); +} diff --git a/kapitel9/global-ex2.c b/kapitel9/global-ex2.c new file mode 100644 index 0000000..488c79c --- /dev/null +++ b/kapitel9/global-ex2.c @@ -0,0 +1,10 @@ +#include + +int x = 999; + +int main(void) +{ + int x = 100; + printf ("x = %d\n", x); + return 0; +} diff --git a/kapitel9/icke-fungerande-scope.c b/kapitel9/icke-fungerande-scope.c new file mode 100644 index 0000000..857c471 --- /dev/null +++ b/kapitel9/icke-fungerande-scope.c @@ -0,0 +1,15 @@ +#include + +extern int x; +extern int y; + +int main(void) +{ + /* Kommer inte att fungera eftersom + y är static i filen + fungerande-scope-fil2.c + */ + printf("x = %d\n", x); + printf("y = %d\n", y); + return 0; +} diff --git a/kapitel9/med-initialisering.c b/kapitel9/med-initialisering.c new file mode 100644 index 0000000..fc12613 --- /dev/null +++ b/kapitel9/med-initialisering.c @@ -0,0 +1,22 @@ +#include +#include +#include + +int main(void) +{ + char *a, *b; + a = malloc(300); + *a = '\0'; + + strcat(a, "hej hej"); + printf("%s\n", a); + free(a); + + b = malloc(30); + *b = '\0'; + strcat(b, "hej igen"); + printf("%s\n", b); + free(b); + + return 0; +} diff --git a/kapitel9/memset-ex1.c b/kapitel9/memset-ex1.c new file mode 100644 index 0000000..d20d3cf --- /dev/null +++ b/kapitel9/memset-ex1.c @@ -0,0 +1,15 @@ +#include +#include +#include + +int main(void) +{ + char *a; + a = malloc(30*sizeof(char)); + memset(a, '\0', 29); + strcat(a, "Hej svejs!"); + printf("%s\n", a); + memset(a, 'A', 15); + printf("%s\n", a); + return 0; +} diff --git a/kapitel9/minneshantering-ex1.c b/kapitel9/minneshantering-ex1.c new file mode 100644 index 0000000..13eacfd --- /dev/null +++ b/kapitel9/minneshantering-ex1.c @@ -0,0 +1,24 @@ +#include +#include +#include + +int main(void) +{ + char *meningen; + + /* Allokera minnet */ + meningen = malloc(sizeof(char)*24); + *meningen = '\0'; /* Initialisera strängen ("noll-terminera") */ + strcpy(meningen, "meningen med livet är"); + printf("%s\n", meningen); + + /* Utöka minnet till 'meningen' */ + meningen = realloc(meningen, sizeof(char)*40); + strcat(meningen, " att programmera"); + printf("%s\n", meningen); + + /* Frigör minnet */ + free(meningen); + + return 0; +} diff --git a/kapitel9/static-ex1.c b/kapitel9/static-ex1.c new file mode 100644 index 0000000..bdce366 --- /dev/null +++ b/kapitel9/static-ex1.c @@ -0,0 +1,18 @@ +#include + +void funk(void); + +int main(void) +{ + funk(); + funk(); + funk(); + return 0; +} + +void funk(void) +{ + int j = 0; + j++; + printf("%d\n", j); +} diff --git a/kapitel9/static-ex2.c b/kapitel9/static-ex2.c new file mode 100644 index 0000000..566e1ad --- /dev/null +++ b/kapitel9/static-ex2.c @@ -0,0 +1,18 @@ +#include + +void funk(void); + +int main(void) +{ + funk(); + funk(); + funk(); + return 0; +} + +void funk(void) +{ + static int j = 0; + j++; + printf("%d\n", j); +} diff --git a/kapitel9/strncpy-ex1.c b/kapitel9/strncpy-ex1.c new file mode 100644 index 0000000..39506a9 --- /dev/null +++ b/kapitel9/strncpy-ex1.c @@ -0,0 +1,15 @@ +#include +#include + +int main(void) +{ + char stor[20] = "Hej Kalle & Lisa!"; + char liten[10] = "XXXXXXXXX"; + + strncpy(liten, stor, sizeof(liten)-1); + + printf("stor = %s\n", stor); + printf("liten = %s\n", liten); + + return 0; +} diff --git a/kapitel9/testar-array.c b/kapitel9/testar-array.c new file mode 100644 index 0000000..1787ffc --- /dev/null +++ b/kapitel9/testar-array.c @@ -0,0 +1,28 @@ +#include + +int main(void) +{ + int i; + char a[5] = "B"; + char b[5] = { 0 }; + + printf("char a:\n"); + for (i = 0; i<5; i++) + { + if (a[i] == '\0') + printf("tecken: NULL\n"); + else + printf("tecken: %c\n", a[i]); + } + + printf("\nchar b:\n"); + for (i = 0; i<5; i++) + { + if (b[i] == '\0') + printf("tecken: NULL\n"); + else + printf("tecken: %c\n", b[i]); + } + + return 0; +} diff --git a/kapitel9/utan-initialisering.c b/kapitel9/utan-initialisering.c new file mode 100644 index 0000000..147ac50 --- /dev/null +++ b/kapitel9/utan-initialisering.c @@ -0,0 +1,20 @@ +#include +#include +#include + +int main(void) +{ + char *a, *b; + a = malloc(300); + + strcat(a, "hej hej"); + printf("%s\n", a); + free(a); + + b = malloc(30); + strcat(b, "hej igen"); + printf("%s\n", b); + free(b); + + return 0; +}