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

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

Δημοσ.

Γεια σε όλους/όλες.

Έχω κάποιες ερωτήσεις όσον αφορά τη C και θα ήθελα αν μπορείτε να με βοηθήσετε.

 

1.Ποια η διαφορά μεταξύ char και const char;

2.Αφού η τιμή που σχετίζεται με τη return μπορεί να είναι οποιαδήποτε έγκυρη έκφραση της C,ποιο το λάθος μου στο παρακάτω κομμάτι κώδικα;

#include <stdio.h>

char func(void);

 

int main(void)

{

char x;

x=func();

 

return 0;

}

 

char func(void)

{

char y;

y="e";

 

return y;

}

 

3.Όποτε τρέχω ένα πρόγραμμα,το αποτέλεσμα εμφανίζεται για λίγο και μετά σβήνει.Ποια εντολή μπορώ να χρησιμοποιήσω για να το αποτρέψω;

 

Ελπίζω να μην έγινα κουραστικός.Ευχαριστώ προκαταβολικά.

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

1) To const αναφέρεται σε σταθερά. Δηλαδή εφόσον εχεις μια "μεταβλητή" δηλωμένη ως const δεν μπορείς μετά να αλλάξεις την τιμή της.

2) Δεν βλεπω καποιο λαθος, τι σου βγάζει;

3) Ο λόγος που κλείνει η κονσόλα ειναι επειδή ανοίγει μονο για όσο χρόνο τρέχει το πρόγραμμα σου. Για να μείνει ανοικτή μπορείς να προσθέσεις την εντολή getchar(); πριν το return της main, έτσι ώστε να πρέπει να τελειώνει το πρόγραμμα αφού ο χρήστης πατήσει καποιο πλήκτρο στο πληκτρολόγιο.

  • Like 1
Δημοσ.

2.Το "e" είναι συμβολοσειρά δηλαδή πίνακας χαρακτήρων με το e και τον κενό χαρακτήρα \0 'e' είναι ο χαρακτήρας e.

Δημοσ.

2. Το πρόβλημα είναι πως στο y αντί να αναθέσεις τον χαρακτήρα 'e', αναθέτεις το c-string "e".

 

3. Με το παρακάτω macro στην αρχή του κώδικά σου...

>
#define pressENTER()								\
do{									\
char mYcHAr;							\
printf( "press ENTER..." );					\
while ( (mYcHAr=getchar()) != '\n' && mYcHAr != EOF )		\
	;							\
}while(0)

μπορείς κατόπιν να γράφεις σε οποιοδήποτε σημείο του κώδικά σου...

 

>
pressENTER();

για να ζητάει από τον χρήστη να πατήσει ENTER πριν συνεχίσει. Αυτό θα δουλεύει πάντα σε όποια πλατφόρμα κι αν προγραμματίζεις.

  • Like 3
Δημοσ.

1.Ποια η διαφορά μεταξύ char και const char;

 

Με το const, λες στον compiler ότι δεν σκοπεύεις να αλλάξεις τιμή στην τάδε μεταβλητή.

 

>
const int k = 5;

/* κώδικας */

k = 6;   /* Πρόβλημα */

 

Στο παραπάνω, ο compiler θα σου πει ότι προσπαθείς να αλλάξεις μια read-only μεταβλητή.

 

Αναφέροντας ότι μια μεταβλητή είναι const, βοηθάς τον compiler να παράξει καλύτερο κώδικα (όταν αυτό γίνεται). Δηλαδή παρά το όνομα const, στην C δεν δημιουργείς μια πραγματική σταθερά.

 

3. Με το παρακάτω macro στην αρχή του κώδικά σου...

>
#define pressENTER()								\
do{									\
char mYcHAr;							\
printf( "press ENTER..." );					\
while ( (mYcHAr=getchar()) != '\n' && mYcHAr != EOF )		\
	;							\
}while(0)

μπορείς κατόπιν να γράφεις σε οποιοδήποτε σημείο του κώδικά σου...

 

>
pressENTER();

για να ζητάει από τον χρήστη να πατήσει ENTER πριν συνεχίσει. Αυτό θα δουλεύει πάντα σε όποια πλατφόρμα κι αν προγραμματίζεις.

 

Η πρόταση του bnvdarklord για σκέτη getchar είναι καλύτερη πιστεύω για την παρούσα περίπτωση. Με το παραπάνω τον μπλέκεις άσκοπα με macros, do-while(0) που ίσως τον μπερδέψει. Επίσης, άλλαξε το char σε int. Nitpick: Το printf χωρίς \n είναι σίγουρο ότι θα εμφανιστεί "σε όποια πλατφόρμα και αν προγραμματίζει" ?

Δημοσ.

Η πρόταση του bnvdarklord για σκέτη getchar είναι καλύτερη πιστεύω για την παρούσα περίπτωση. Με το παραπάνω τον μπλέκεις άσκοπα με macros, do-while(0) που ίσως τον μπερδέψει.

Δεν έχει ίδια λειτουργικότητα το getchar() με το macro (btw, μπορεί να το χρησιμοποιεί για όσο διάστημα χρειαστεί χωρίς να καταλαβαίνει γιατί και πως δουλεύει)

 

Επίσης, άλλαξε το char σε int. Nitpick: Το printf χωρίς \n είναι σίγουρο ότι θα εμφανιστεί "σε όποια πλατφόρμα και αν προγραμματίζει" ?

To char δεν χρειάζεται να αλλάξει, αφού δεν χρησιμοποιείται η τιμή επιστροφής της getchar(). Για την printf() δεν είναι σίγουρο, αν πάει σε καμιά περίεργη πλατφόρμα κι αντιμετωπίσει πρόβλημα και μας ξαναρωτήσει θα του πούμε να κάνει flush την έξοδο :P

Δημοσ.

2. Το πρόβλημα είναι πως στο y αντί να αναθέσεις τον χαρακτήρα 'e', αναθέτεις το c-string "e".

 

Δηλαδή migf1,το πρόβλημα είναι τα διπλά εισαγωγικά;

Δημοσ.

2. Το πρόβλημα είναι πως στο y αντί να αναθέσεις τον χαρακτήρα 'e', αναθέτεις το c-string "e".

 

Δηλαδή migf1,το πρόβλημα είναι τα διπλά εισαγωγικά;

 

 

ναι

κάτι που θα εβρισκες ευκολα κάνοντας compile τον κώδικα σου....

 

Link

  • 1 μήνα μετά...
Δημοσ.

#include <stdio.h>

 

int main(void)

{

int num,num1;

 

printf("Dwse enan arithmo: \n");

scanf("%d",&num);

 

printf("Dwse akoma enan arithmo: \n");

scanf("%d",&num1);

 

printf("To athroisma einai:%d \n",num+num1);

printf("H diafora einai:%d \n",num-num1);

printf("To ginomeno einai:%d \n",num*num1);

printf("To upoloipo einai:%d \n",num%num1);

 

getchar();

 

return 0;

 

}

 

Σ'αυτό το πρόγραμμα,γιατί δεν δουλεύει η getchar;

Δημοσ.

...

Σ'αυτό το πρόγραμμα,γιατί δεν δουλεύει η getchar;

Διότι η getchar() δεν αποτελεί λύση στο πρόβλημα του line-buffering, και για αυτόν ακριβώς το λόγο επιμένω να ΜΗΝ την προτείνω και δίνω το macro που έδωσα και σε σένα (το οποίο επίσης δεν αποτελεί γενική λύση).

 

Το θέμα το έχουμε αναλύσει πάρα πολλές φορές και σε αυτό το φόρουμ. Είναι μάλιστα τόσο μεγάλη η συχνότητα με την οποίαν επαναλαμβάνεται η ίδια ερώτηση, ώστε έφτιαξα μια γενική βιβλιοθήκη με αναλυτική τεκμηρίωση στα Ελληνικά, και πλέον παραπέμπω εκεί όποιον ενδιαφέρεται (για να την διαβάσει ή/και να την χρησιμοποιήσει) ...

 

http://www.insomnia.gr/topic/436079-prompt-for-%CE%B1%CF%80%CE%BB%CE%AE-%CE%B2%CE%B9%CE%B2%CE%BB%CE%B9%CE%BF%CE%B8%CE%AE%CE%BA%CE%B7-%CE%B3%CE%B9%CE%B1-%CE%B5%CF%8D%CE%BA%CE%BF%CE%BB%CE%BF-%CE%B4%CE%B9%CE%AC%CE%B2%CE%B1%CF%83%CE%BC%CE%B1-%CF%84%CE%B7%CF%82-%CE%BA%CF%8D%CF%81%CE%B9/page__p__4557598__hl__prompt_for__fromsearch__1#entry4557598

Δημοσ.

capoelo, η getchar() δε σου δουλεύει γιατί δεν είναι μέσα στην βιβλιοθήκη stdio.h. Πρέπει να κάνεις #include <conio.h>...

 

Να πω κι εγώ τη μαλακία μου, αντί για την getchar(), μπορείς να κάνεις system("pause"); αφού κάνεις #include "stdlib.h"

  • Like 1
Δημοσ.

Το CONIO το παρείχαν οι μεταφραστές της Borland για DOS (βλ. Turbo C++) και σήμερα συνεχίζουν να το δίνουν και στα Windows (βλ. Embarcadero C++ Builder) εξυπηρετώντας αρκετά την ανάπτυξη Console εφαρμογών.

 

Μια ανάλογη βιβλιοθήκη έδιναν και οι παλιοί μεταφραστές DOS της Microsoft (βλ. Microsoft-C 6) με κοινές (ορισμένες) ρουτίνες προς το CONIO (και με κάποιες άλλες διαφορετικές αλλά με παρόμοια λειτουργικότητα).

 

Γενικά το CONIO στον κόσμο του DOS ήταν ένα defacto στάνταρτ μεταξύ των πιο δημοφιλών μεταφραστών.

Δημοσ.

Στις περισσότερες περιπτώσεις,η getchar λειτουργεί κανονικά με <stdio.h>.Επίσης και τα <conio.h> και <stdlib.h> λειτουργούν τέλεια γιατί προγραμματίζω σε windows.Η getchar() μπορεί να εφαρμοστεί σε οποιοδήποτε λειτουργικό σύστημα;

Επίσης-"Να θυμάστε ότι εάν μία μεταβλητή χρησιμοποιείται σαν όρισμα σε μία συνάρτηση,αυτή δεν έχει καμία σχέση με την τυπική παράμετρο που δέχεται την τιμή της".

Τι εννοεί;

 

Υ.Γ.Πάντως,σας ευχαριστώ όλους για τις απαντήσεις που μου δίνετε και ελπίζω να μην σας κουράζω.

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

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