Η memset() όμως, όπως επισημαίνεις ήδη, δεν εξασφαλίζει πως στο scanf() δεν θα εισαχθεί string μεγαλύτερο από το δηλωμένο μέγιστο μήκος του buffer, περίπτωση κατά την οποία το buffer δεν θα είναι null-terminated. Είναι επίσης overkill όλη αυτή η διαδικασία (και με κόστος σε επιδόσεις) για το διάβασμα και τη σύγκριση απλώς ενός χαρακτήρα.
Κάτι ακόμα τώρα, σχετικά με το διάβασμα strings γενικώς: το πρόβλημα της fgets() είναι πως διαβάζει και το '\n', που βέβαια στη περίπτωση του συγκεκριμένου προγράμματος δεν μας ενοχλεί, αλλά γενικότερα συχνά χρειάζεται να πάμε να το σβήσουμε χειροκίνητα. Επίσης, η gets() έχει έτσι κι αλλιώς πρόβλημα, αφού δεν ελέγχει καν πλήθος χαρακτήρων.
Ελπίζοντας πως θα σας φανεί χρήσιμη γενικώς και όχι μόνο για το συγκεκριμένο πρόγραμμα, σας παραθέτω μια δική μου συνάρτηση στην οποία συνδυάζω τη λειτουργικότητα των gets() και fgets(). Δηλαδή διαβάζει από το stdin μέχρι όσους χαρακτήρες της έχουμε πει ή μέχρι να βρει '\n', αλλά αντίθετα με την fgets() αυτή διαγράφει το '\n' πριν επιστρέψει.
Πρότυπο: char *s_get(char *s, size_t len);
Κώδικας:
- Κώδικας: Επιλογή όλων
char *s_get(char *s, size_t len)
{
char *cp;
for (cp=s; (*cp=getc(stdin)) != '\n' && (cp-s) < len-1; cp++ )
; // for-loop with empty body */
*cp = '\0'; // null-terminate last character
return s;
}
Ανάλυση, βήμα-βήμα:
http://www.gvrteam.gr/forum/viewtopic.p ... 189#p47189Μπορείτε πολύ εύκολα να τη αλλάξετε ώστε να διαβάζει οποιοδήποτε filestrem και όχι μόνο το stdin
