» »

[C] Zakaj točno "printf(getchar() != EOF);" ne dela in zakaj potrebujem "%d"

[C] Zakaj točno "printf(getchar() != EOF);" ne dela in zakaj potrebujem "%d"

Rias Gremory ::

Živjo,

začel sem se učiti C s The C Programming Language od K&R.
Sem pri vaji 1-6 pri poglavju Character Input and Output.
Vaja pravi:
Exercise 1-6. Verify that the expression getchar() != EOF is 0 or 1.

Poženem v terminalu in napišem nek znak potem ponovno poženem in končam z CTRL+D. CTRL+D vrne 0, znaki pa 1.

Najprej sem probal
#include <stdio.h>

main()
{
	printf(getchar() != EOF);
}

ampak mi vrne segmentation fault.

Tole pa deluje:
#include <stdio.h>

main()
{
	printf("%d", getchar() != EOF);
}


Torej vprašanje je zakaj točno rabim %d?
Če prav razumem %d pove printf-u, da bo getchar() vrnil vrednost tipa int?
Imam prav?

EDIT: Typo.
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

sas084 ::

Glede na definicijo, printf vzame 1 ali več argumentov, kjer je prvi argument pointer na formatiran niz, ostali argumenti pa so opcijski (glede na to katere vrednosti za formatiranje uporabljaš v nizu). V prvem primeru
#include <stdio.h>
 
main()
{
    printf(getchar() != EOF);
}

si za pointer na formatiran niz dal vrednost "true" al pa "false" (odvisno kaj ti vrne "getchar() != EOF"), če to prevedeš v C dobiš vrednosti 0x01 ali 0x00 oz. če vzameš da maš 32-bitne pointerje potem dobiš vrednosti 0x00000001 oz 0x00000000, iz katerih je potem poskušala funkcija brat niz. Glede na memory mapping si dal naslov do interrupt vektorjev, do katerih seveda nimaš dostopa, zato si dobil segmentation fault. Funkcija getchar vrne naslednji znak iz standard inputa oz. EOF ki pomeni da na stdin-u ni več podatkov oz. da je prišlo pri branju do napake.

szalb ::

Dober odgovor, sas084. :-)

Rias Gremony, imaš prav, "%d" v formatu funkciji pove, da bo pripadajoč argument tipa int. V tvojem primeru je ta argument izraz getchar() != EOF, ki preveri, ali je vrednost, ki jo vrne klic funkcije getchar, različna od konstante EOF (to je ponavadi makro #define EOF -1); izraz se ovrednoti v 1, če je prebrana vrednost različna od EOF in 0 sicer.

Zgodovina sprememb…

  • spremenil: szalb ()

Invictus ::

Preberi si dokumentacijo za printf ...
"Life is hard; it's even harder when you're stupid."

http://goo.gl/2YuS2x

Rias Gremory ::

Hvala vsem za odgovor!

@Invictus
Bom jutri prečital, obljubim.
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

lebdim ::

Poglej si, kako se izpisuje v programskem jeziku C stringe. Ziher piše v knjigi.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] čuden izpis iz txt dat. na zaslon

Oddelek: Programiranje
121665 (1402) l0g1t3ch
»

[C++][Naloga_polja]MIN in MAX polja, izpis za x.100 stevil

Oddelek: Programiranje
222940 (2751) snow
»

strcpy reče segmatation fault

Oddelek: Programiranje
101497 (1448) MasterMind
»

[c++] Kako ugotoviti katera tipka je bila pritisnjena

Oddelek: Programiranje
141481 (1253) 64202
»

C problemček

Oddelek: Programiranje
131062 (865) OwcA

Več podobnih tem