Προς το περιεχόμενο

provlhma sthn emfanish toy arxeioy exe


air560002000

Προτεινόμενες αναρτήσεις

Δημοσ.

Εννοείς ότι κλείνει γρήγορα το παράθυρο της κονσόλας του dos; Αν είναι έτσι, τότε πρόσθεσε πριν το τέλος της main(), το εξής: getc(stdin). Τώρα κατά την εκτέλεση, πατώντας <Enter> κλείνει το παράθυρο.

Δημοσ.

sto arxeio exe to parathyro ths konsolas tou dos moy kleinei otan o xrhsths pathsei enter afoy prohgoymenws exei eisagei kapoio dedomeno.ti entolh prepei na balw s aythn periptwsh;to programma einai se c.sygkekrimena sto programma xrhsimopoieitai mia entolh if opy synergazetai me ton xrhsth prokeimenoy na ginei elegxos ths sunthhkhs toy if.

Δημοσ.

Η εντολή που σου έδωσε ο Sta πρέπει να είναι τελευταία, και έξω από οποιαδήποτε συνθήκη, loop, κτλ.

 

Όμως να θυμάσαι ότι η παραπάνω προσθήκη είναι ένα τέχνασμα για να μην κλείνει το παράθυρο του dos που ανοίγει ειδικά για το πρόγραμμά σου. Μην την βλέπεις ως μέρος του προγράμματός σου.

Γιατί φυσιολογικά το πρόγραμμά σου θα τρέχει από ένα ήδη ανοιχτό παράθυρο dos. Το οποίο δεν θα κλείσει όταν τελειώσει το πρόγραμμά σου (επειδή δεν άνοιξε ειδικά γι' αυτό).

 

Άρα μια άλλη λύση είναι: άνοιξε μόνος σου ένα παράθυρο dos, πήγαινε στον κατάλογο που είναι το .exe και τρέχε το από εκεί.

Δημοσ.

pws anoigw monos moy ena parathyro dos?thn entolh getc(stdin) thn ebala sto telos opws eprepe.alla otan patas enter opws anefere kai o sta xavetai to parathyro kai sth sygkekrimenh periptwsh prepei na pathsw enter gia na eisagw dedomena.

Δημοσ.

Αν θες να εισάγεις δεδομένα, προφανώς χρειάζεσαι και άλλη getc ή scanf ή gets ή κάτι τέτοιο. Άρα πρέπει να βάλεις ότι θα έβαζες για να εισάγεις τα δεδομένα, και να αφήσεις και την getc που έβαλες στο τέλος να κάνει τη δική της δουλειά, οποία είναι να καθυστερήσει το κλείσιμο του παραθύρου, και όχι να δεχτεί δεδομένα!

 

Μόνος σου παράθυρο dos (παντού) ανοίγεις ως εξής: Start -> Run και γράφεις cmd.

Στα XP Start (Έναρξη) -> All Programs (Προγράμματα) -> Accessories (Βοηθήματα) -> Command Prompt (Παράθυρο DOS; Κονσόλα; δεν θυμάμαι τη μετάφραση)

Στα 98 κάτι παρόμοιο.

 

Καλά πας ξημερώματα βλέπω.. αυτά έχει ο προγραμματισμός!

Δημοσ.

Ναι, αυτό είναι λίγο επικίνδυνο σημείο και πρέπει να το προσέξεις. Χρησιμοποιώντας τη συνάρτηση scanf π.χ. για να εισάγεις έναν ακέραιο μένει στο stdin ο χαρακτήρας αλλαγής γραμμής. Αυτό συμβαίνει διότι εσύ δίνεις τον ακέραιο και μετά πατάς <Enter>, η scanf όμως τραβάει από την stdin μόνο τον ακέραιο αφήνοντας το χαρακτήρα αλλαγής γραμμής. Για αυτό το λόγο χρειάστηκες 2 getc(), όπως είπες. Η πρώτη τραβάει το ήδη "έτοιμο" <Enter> από το stdin ενώ η δεύτερη περιμένει να της δώσεις εσύ το <Enter>. Μία λύση σε τέτoιου είδους προβλήματα είναι το: fflush(stdin) που στέλνει ότι έχει η stdin στα σκουπίδια. Οπότε στο τέλος του προγράμματός σου μπορείς να βάλεις: fflush(stdin); getc(stdin);

Η χρήση πάντως συναρτήσεων όπως: scanf() και gets() γενικά δεν ενδείκνυται, καλύτερα να προτιμάς να κάνεις το δικό σου parsing από το stdin.

Δημοσ.

dhladh an xrhsimopoioysa dyo fores thn scanf tote tha eprepe na balw tria getc giati oi dyo getc tha eixoyn etoimo enter.me to fflush xanontai sth periptwsh ayth ta dyo enter h alliws \n ap thn stdin.etsi den einai;to dokimasa to fflush.poly kalo.ti einai to parsing.

Δημοσ.
dhladh an xrhsimopoioysa dyo fores thn scanf tote tha eprepe na balw tria getc giati oi dyo getc tha eixoyn etoimo enter.me to fflush xanontai sth periptwsh ayth ta dyo enter h alliws \n ap thn stdin.etsi den einai;to dokimasa to fflush.poly kalo.ti einai to parsing.

 

Όχι, αν χρησιμοποιούσες 2 scanf() και πάλι 2 getc() θα χρειαζόσουν. Αυτό συμβαίνει διότι η δεύτερη scanf("%d",...) ψάχνει π.χ. για τον πρώτο ακέραιο που θα βρει στο stdin, έτσι τραβάει το πρώτο '\n' και έπειτα τον ακέραιο, αφήνοντας μόνο το τελευταίο '\n'. Η λογική είναι ότι η scanf διαβάζει από την stdin μέχρις ότου να βρει τον τύπο μεταβλητής που ψάχνει, αν ας πούμε εσύ στο scanf("%d",...) δώσεις: abc1abc2<Enter>, στο stdin θα μείνει το abc2<Enter>. Σε επόμενη κλήση της scanf("%d",...) θα διαβαστεί μέχρι και το 2 που είχε μείνει στο stdin, χωρίς εσύ να προλάβεις να δώσεις κάποιο ακέραιο. Αυτό λύνεται αν μετά από κάθε scanf() κάνεις και fflush(stdin). Αυτό δεν είναι σωστή προγραμματιστική τεχνική για αυτό και καλό είναι να διαβάζεις byte-byte από την είσοδο και να ερμηνεύεις εσύ ο ίδιος τι σημαίνει κάθε byte. Το τελευταίο λέγεται parsing.

Δημοσ.

dhladh panta dyo getc xreiazontai gia paradeigma

 

tote h prwth scanf("%d",...):eisagw abc1abc2<enter> kai tote diavazei abc1

h deyterh scanf("%d",...):diavazei abc2

h trith scanf("%d",...):eisagw abc3<enter>.kai diavazei <enter>abc3

 

h prwth getc pairnei to enter poy menei sto stdin

h deyterh getc antapokrinetai me to diko mas enter.

 

an valoyme s ayth thn periptwsh to fflush sto telos ths main prin thn getc tote xanetai to enter ap to stdin kai h mia getc poy exoyme antapokrinetai me to diko mas enter.

 

twra an valw fflush meta apo kathe scanf

 

 

prwth scanf:eisagw abc1abc2<enter> tote diavazei abc1 kai xanetai to ypoloipo

deyterh scanf:tha prepei na ksanaeisagw px eisagw e2<enter> tote diavazei to e2 kai xanetai to enter.erwthsh:de ginotan na eisagoyme mono e2 thelei kai enter e?

trith scanf:eisagoyme gia paradeigma r4t5<enter> tote tha diavasei to r4 kai to ypoloipo xanetai

 

sto telos ths main vazoyme twra mia getc poy perimenei to diko mas enter.symfwneis h diafwneis?

Δημοσ.
dhladh panta dyo getc xreiazontai gia paradeigma

 

tote h prwth scanf("%d"' date='...):eisagw abc1abc2<enter> kai tote diavazei abc1

h deyterh scanf("%d",...):diavazei abc2

h trith scanf("%d",...):eisagw abc3<enter>.kai diavazei <enter>abc3

 

h prwth getc pairnei to enter poy menei sto stdin

h deyterh getc antapokrinetai me to diko mas enter.

[/quote']

Σωστός, απλώς σκέψου στην τελευταία εισαγωγή αν δώσεις πάλι abc3abc<Enter>, τα δυο getc() θα διαβάσουν τα a,b και θα επιστρέψουν αμέσως χωρίς να προλάβεις να πατήσεις <Enter>. Για αυτό λέω να χρησιμοποιείς την fflush() για να προλαβαίνεις τις λάθος εισόδους του χρήστη.

 

an valoyme s ayth thn periptwsh to fflush sto telos ths main prin thn getc tote xanetai to enter ap to stdin kai h mia getc poy exoyme antapokrinetai me to diko mas enter.

Σωστός

 

twra an valw fflush meta apo kathe scanf

 

prwth scanf:eisagw abc1abc2<enter> tote diavazei abc1 kai xanetai to ypoloipo

deyterh scanf:tha prepei na ksanaeisagw px eisagw e2<enter> tote diavazei to e2 kai xanetai to enter.erwthsh:de ginotan na eisagoyme mono e2 thelei kai enter e?

Θέλει και <Enter> για να αρχίσει η scanf() να διαβάζει από την stdin.

 

trith scanf:eisagoyme gia paradeigma r4t5<enter> tote tha diavasei to r4 kai to ypoloipo xanetai

 

sto telos ths main vazoyme twra mia getc poy perimenei to diko mas enter.symfwneis h diafwneis?

Σωστός και πάλι.

Δημοσ.

s eyxaristw!me vohthises na katalavw.endiaferoysa h periptwsh poy anafereis h teleytaia eisodos na einai abc3abc<enter>.na se rwthsw kati teleytaio.s ayth thn periptwsh tha xreiastoyn 5 getc gia na kleisei to parathyro toy dos me to diko mas enter.ena getc gia to a,ena gia to b ,ena gia to c, ena gia to enter kai ena poy tha antapokrinetai me to diko mas enter.dhladh to getc diavazei ena xarakthra.fflush tha xrhsimopoiw alla gia na to katanohsw

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...