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

Ερωτήσεις για C


capoelo

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

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

Έχω κάποιες ερωτήσεις όσον αφορά τη 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. Το πρόβλημα είναι πως στο 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() μπορεί να εφαρμοστεί σε οποιοδήποτε λειτουργικό σύστημα;

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

Τι εννοεί;

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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