Προς το περιεχόμενο
  • Εγγραφή
  • 0

Ερωτήσεις για 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
  • Δημιουργία
  • Τελευταία απάντηση

Συχνή συμμετοχή στην ερώτηση

Συχνή συμμετοχή στην ερώτηση

Δημοφιλή Μηνύματα

Το μεσημέρι κάνοντας sign-in είδα ότι πριν λίγες μέρες μου ήρθε ένα pm (σόρυ για την αργοπορία) από ένα φίλο εδώ που έλεγε ότι διάβασε ότι τα Hash Tables χρησιμοποιούνται για γρήγορο search και ήθελε

> if(argv[2]>argv[3]) printf("The difference is:%d\n",k-j);   Το argv είναι char*[], επομένως συγκρίνεις char* μεταξύ τους -- και όχι τα strings στα οποία δείχνουν (που θα ήταν επίσης λάθο

2. Το πρόβλημα είναι πως στο y αντί να αναθέσεις τον χαρακτήρα 'e', αναθέτεις το c-string "e".   3. Με το παρακάτω macro στην αρχή του κώδικά σου... > #define pressENTER() \ do{

Δημοσιευμένες Εικόνες

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

  • 0

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

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

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

  • Like 1
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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 είναι σίγουρο ότι θα εμφανιστεί "σε όποια πλατφόρμα και αν προγραμματίζει" ?

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

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

 

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

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

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

 

 

ναι

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

 

Link

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

#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;

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

...

Σ'αυτό το πρόγραμμα,γιατί δεν δουλεύει η 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

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

  • Like 1
Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

 

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

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

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

Τι εννοεί;

 

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

Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

...

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

Τι εννοεί;

...

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

 

Αν θες να περνάνε οι αυθεντικές μεταβλητές στις συναρτήσεις, τότε πρέπει να δηλώνεις και να διαχειρίζεσαι ως δείκτες τα ορίσματά στις συναρτήσεις και όταν καλείς την συνάρτηση να της περνάς τις διευθύνσεις των μεταβλητών.

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

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

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.