Όταν κάνω compile το πρόγραμμα με την gets o compiler το κάνει κανονικά compile αλλά μου δίνει αυτό το μήνυμα: /usr/bin/ld: /tmp/ccTTB3aA.o: in function `main': string2.c:(.text+0x35): warning: the `gets' function is dangerous and should not be used. Γιατί είναι dangerous? μήπως να μην την χρησιμοποιούμε και πάρα πολύ? Ακόμα μου προτείνει να χρησιμοποιώ την fgets. Τι εννοεί επικίνδυνη??? και γιάτι δεν πρέπει να τη χρησιμοποιούμε ?? Ρωτάω γιατί είμαι και γω λίγο μίζερος :)
Ναι υπάρχει ένα θέμα εδώ. Απ' ότι είδα, ο gcc εμφανίζει αυτό το μήνυμα λάθους, γιατί στο πρότυπο 11 και εξής, η gets καταργείται γιατί θεωρείται επικίνδυνη. Βέβαια, για λόγους συμβατότητας, θα διατηρηθεί η συνάρτηση για κάποιες δεκαετίες ακόμη και απλά θα πετά αυτό το αντιαισθητικό warning. Η επικινδυνότητά της συνίσταται στο ότι δεν έχει κάποιο όριο και μπορεί να συνεχίζει να διαβάζει από την είσοδο παρόλο που δεν υπάρχει κατάλληλος αποθηκευτικός χώρος (π.χ. να αποθηκεύσει συμβολοσειρά 1000b σε ένα μικρό buffer 10θ) και αυτό θεωρείται επικίνδυνο για κακόβουλη χρήση. Συνίσταται η χρήση της fgets πλέον, η οποία παίρνει ρητό όρισμα το πόσα bytes θα διαβάσει το πολύ. Περισσότερα εδώ: stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used Πάντως επί του πρακτέου, και μιας και αυτό το θέμα είναι αρκετά προχωρημένο, συνιστώ να συνεχίσεις κανονικά με την gets. Όταν με το καλό φτάσεις στο μάθημα 15, θα βρεις και την fgets και έτσι πλέον θα μπορείς να "ξεχάσεις" πια την gets και τα ψυχολογικά προβλήματά της.
@@psounis Ναι, το έψαξα και εγώ λιγάκι εχθές, γιατί δεν περίμενα μέσα Αυγούστου απάντηση τόσο σύντομα, σας ευχαριστώ πολύ. Θα συνεχίσω κανονικά την ροή του μαθήματος όπως είναι με την gets, και βλέπουμε.(παρόλο που ο ψυχαναγκασμός βάρεσε λίγο κόκκινο αχαχαχ).
Οταν θελαμε να εμφανισουμε εναν πινακα με χρηση της printf,δε θυμαμαι απλα να διναμε σαν ορισμα μονο την ονομασια του πινακα, οποτε τωρα βαζοντας μονο το ονομα,που ξερει ο μεταγλωτιστης ποσα στοιχεια να εμφανισει?
Στις συμβολοσειρές, το τέλος τους μπορεί να εντοπιστεί από τον ειδικό χαρακτήρα \0 που είναι πάντα στο τέλος της. Εντοπίζεται κατά το χρόνο εκτέλεσης (με δική μας προγραμματιστική ευθύνη), όχι από το μεταγλωττιστή.
@@psounis ειναι απολυτα κατανοητο αυτο οκ, εγω μιλαω για το συντακτικο εμφανισης των συμβολοσειρων, μεχρι στιγμης οταν θελαμε να εμφανισουμε ολα τα στοιχεια ενος πινακα, καναμε διαπεραση ενα ενα τα στοιχεια μεσω ενος iindex και γινοταν η εμφανιση, τωρα γτ αρκει ξαφνικα μονο η ονομασια του πινακα και ο τροποσ με τον index δεν τρεχει? Για παραδειγμα, στον εξης κωδικα, η εμφανιση δε γινεται σωστα, αν ομως επροκειτο για string θα γινοταν σωστα,αυτο δεν καταλαβαινω: #include main() { int pinakas[15]; printf ("%d",pinakas); /* αν ηταν string και εβαζα %s με την δηλωση char pinakas[15]; θα ετρεχε σωστα, και τα δυο ομως μονοδιαστατοι πινακες ειναι,αυτο δεν καταλαβαινω */ } // μηπως ο λογος που το συντακτικο ειναι τετοιο στην περιπτωση αυτη, ειναι οτι ο compiler καταλαβαινει απο μονοςς του πού θα σταματησει λόγω του \0 ?? Επισης μια τελευταια ερωτηση που εχω, ειναι για ποιον λογο αν δε γινει αρχικοποιηση μιας συμβολοσειρας, το .exe δε θα εμφανιζει τιποτα?Μηπως θα απαντηθουν καποιες απο τις ερωτησεις σε επομενα μαθηματα?
Ναι ισχύει αυτό που σκέφτηκες, ότι δηλαδή η printf καταλαβαίνει το τέλος της συμβολοσειράς με το \0, όπως θα το κάναμε και εμείς. Αν δε γίνει αρχικοποίηση της συμβολοσειράς, δεν ξέρουμε τη συμπεριφορά του προγράμματος. Ο δείκτης θα περιέχει σκουπίδια, που σημαίνει ότι μπορεί να σταματήσει αμέσως, μπορεί να τυπώσει μερικά περίεργα αποτελέσματα ή και να σκάσει το πρόγραμμα.
@@psounis οκ οποτε να υποθεσω οτι η εμφανιση μιας συμβολοσειρας μεσω index εχει "αποκλειστει" και δεν τρεχει για να ειμαστε αναγκασμενοι να το κανουμε ιο ευκολα, απλα με την ονομασια του πινακα σαν δευτερο ορισμα στην printf ?
@@ΣταύροςΓατέας-ε9λ Ακριβώς, είναι μία διευκόλυνση για εμάς αυτό το συντακτικό. Μπορείς πάντως να τυπώσεις τη συμβολοσειρά χαρακτήρα - χαρακτήρα κάπως έτσι: for (i=0; i
10:26 "και τσιμπάω λίγο το στρινγκ, με το συμπάθιο"😂😂
ΣΑΣ ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ ΚΥΡΙΕ ΨΟΥΝΗ ΜΟΛΙΣ ΕΜΑΘΑ ΟΤΙ ΠΕΡΑΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΚΑΙ ΕΧΕΤΕ ΤΟΥΛΑΧΙΣΤΟΝ 85% ΑΝΑΜΕΙΞΗ ΣΕ ΑΥΤΗ ΤΗΝ «ΕΠΙΤΥΧΙΑ». ΠΑΜΕ ΓΙΑ C++
Αν και το προσδιόρισες με αξιοπρόσεκτη ακρίβεια, πιστεύω ότι η ανάμειξη μου είναι πολύ μικρότερη. Να είσαι καλά φίλε, πάντα επιτυχίες!
κ. Ψούνη μας έχετε σώσει !
Ευχαριστω Πολυ
Όταν κάνω compile το πρόγραμμα με την gets o compiler το κάνει κανονικά compile αλλά μου δίνει αυτό το μήνυμα:
/usr/bin/ld: /tmp/ccTTB3aA.o: in function `main':
string2.c:(.text+0x35): warning: the `gets' function is dangerous and should not be used.
Γιατί είναι dangerous? μήπως να μην την χρησιμοποιούμε και πάρα πολύ?
Ακόμα μου προτείνει να χρησιμοποιώ την fgets. Τι εννοεί επικίνδυνη??? και γιάτι δεν πρέπει να τη χρησιμοποιούμε ??
Ρωτάω γιατί είμαι και γω λίγο μίζερος :)
Ναι υπάρχει ένα θέμα εδώ.
Απ' ότι είδα, ο gcc εμφανίζει αυτό το μήνυμα λάθους, γιατί στο πρότυπο 11 και εξής, η gets καταργείται γιατί θεωρείται επικίνδυνη.
Βέβαια, για λόγους συμβατότητας, θα διατηρηθεί η συνάρτηση για κάποιες δεκαετίες ακόμη και απλά θα πετά αυτό το αντιαισθητικό warning.
Η επικινδυνότητά της συνίσταται στο ότι δεν έχει κάποιο όριο και μπορεί να συνεχίζει να διαβάζει από την είσοδο παρόλο που δεν υπάρχει κατάλληλος αποθηκευτικός χώρος (π.χ. να αποθηκεύσει συμβολοσειρά 1000b σε ένα μικρό buffer 10θ) και αυτό θεωρείται επικίνδυνο για κακόβουλη χρήση.
Συνίσταται η χρήση της fgets πλέον, η οποία παίρνει ρητό όρισμα το πόσα bytes θα διαβάσει το πολύ.
Περισσότερα εδώ:
stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used
Πάντως επί του πρακτέου, και μιας και αυτό το θέμα είναι αρκετά προχωρημένο, συνιστώ να συνεχίσεις κανονικά με την gets.
Όταν με το καλό φτάσεις στο μάθημα 15, θα βρεις και την fgets και έτσι πλέον θα μπορείς να "ξεχάσεις" πια την gets και τα ψυχολογικά προβλήματά της.
@@psounis Ναι, το έψαξα και εγώ λιγάκι εχθές, γιατί δεν περίμενα μέσα Αυγούστου απάντηση τόσο σύντομα, σας ευχαριστώ πολύ. Θα συνεχίσω κανονικά την ροή του μαθήματος όπως είναι με την gets, και βλέπουμε.(παρόλο που ο ψυχαναγκασμός βάρεσε λίγο κόκκινο αχαχαχ).
Οταν θελαμε να εμφανισουμε εναν πινακα με χρηση της printf,δε θυμαμαι απλα να διναμε σαν ορισμα μονο την ονομασια του πινακα, οποτε τωρα βαζοντας μονο το ονομα,που ξερει ο μεταγλωτιστης ποσα στοιχεια να εμφανισει?
Στις συμβολοσειρές, το τέλος τους μπορεί να εντοπιστεί από τον ειδικό χαρακτήρα \0 που είναι πάντα στο τέλος της. Εντοπίζεται κατά το χρόνο εκτέλεσης (με δική μας προγραμματιστική ευθύνη), όχι από το μεταγλωττιστή.
@@psounis ειναι απολυτα κατανοητο αυτο οκ, εγω μιλαω για το συντακτικο εμφανισης των συμβολοσειρων, μεχρι στιγμης οταν θελαμε να εμφανισουμε ολα τα στοιχεια ενος πινακα, καναμε διαπεραση ενα ενα τα στοιχεια μεσω ενος iindex και γινοταν η εμφανιση, τωρα γτ αρκει ξαφνικα μονο η ονομασια του πινακα και ο τροποσ με τον index δεν τρεχει? Για παραδειγμα,
στον εξης κωδικα, η εμφανιση δε γινεται σωστα, αν ομως επροκειτο για string θα γινοταν σωστα,αυτο δεν καταλαβαινω:
#include
main()
{
int pinakas[15];
printf ("%d",pinakas); /* αν ηταν string και εβαζα %s με την δηλωση char pinakas[15]; θα ετρεχε σωστα, και τα δυο ομως μονοδιαστατοι πινακες ειναι,αυτο δεν καταλαβαινω */
} // μηπως ο λογος που το συντακτικο ειναι τετοιο στην περιπτωση αυτη, ειναι οτι ο compiler καταλαβαινει απο μονοςς του πού θα σταματησει λόγω του \0 ??
Επισης μια τελευταια ερωτηση που εχω, ειναι για ποιον λογο αν δε γινει αρχικοποιηση μιας συμβολοσειρας, το .exe δε θα εμφανιζει τιποτα?Μηπως θα απαντηθουν καποιες απο τις ερωτησεις σε επομενα μαθηματα?
Ναι ισχύει αυτό που σκέφτηκες, ότι δηλαδή η printf καταλαβαίνει το τέλος της συμβολοσειράς με το \0, όπως θα το κάναμε και εμείς.
Αν δε γίνει αρχικοποίηση της συμβολοσειράς, δεν ξέρουμε τη συμπεριφορά του προγράμματος. Ο δείκτης θα περιέχει σκουπίδια, που σημαίνει ότι μπορεί να σταματήσει αμέσως, μπορεί να τυπώσει μερικά περίεργα αποτελέσματα ή και να σκάσει το πρόγραμμα.
@@psounis οκ οποτε να υποθεσω οτι η εμφανιση μιας συμβολοσειρας μεσω index εχει "αποκλειστει" και δεν τρεχει για να ειμαστε αναγκασμενοι να το κανουμε ιο ευκολα, απλα με την ονομασια του πινακα σαν δευτερο ορισμα στην printf ?
@@ΣταύροςΓατέας-ε9λ Ακριβώς, είναι μία διευκόλυνση για εμάς αυτό το συντακτικό.
Μπορείς πάντως να τυπώσεις τη συμβολοσειρά χαρακτήρα - χαρακτήρα κάπως έτσι:
for (i=0; i
Γεια σας! Ηθελα να ρωτησω με ποιο πληκτρο μαρκαρετε ολο τον κωδικα κατευθειαν? Για να τον κανετε αντιγραφη για παραδειγμα.
ctrl+A επιλέγεις όλον τον κώδικα.
Σας ευχαριστω!!
πως μπορω σε καθε μια θεση να βαζω ενα ονομα ?
Τι εννοείς;
Αν τρέξουμε αυτό, έχει πλάκα ότι η gets μαζεύει ό,τι παράτησε η scanf.
#include
main()
{
char string[80];
printf("Dwse onoma kai epitheto: ");
scanf("%s",string);
printf("
Onoma: %s",string);
gets(string);
printf("
Epitheto: ");
puts(string);
}
Ισχύει. Όταν θα μελετήσουμε τις ροές (μαθήματα 16+) θα δούμε και γιατί συμβαίνει αυτό.