Δημοσιεύτηκε: 30 Ιαν 2012, 20:58
Ναι. Αυτό που μάλλον σε μπέρδεψε είναι πως στα εγχειρίδια και στα βιβλία τα c-strings συμβολίζονται ως: char * ή char[] γιατί στην πραγματικότητα είναι όντως δείκτες στον 1ο στοιχείο ενός πίνακα χαρακτήρων, με την έξτρα προϋπόθεση πως στο τέλος τους πρέπει να έχουν τον μηδενικό χαρακτήρα (ή πριν το τέλος τους, αλλά να έχουν τουλάχιστον έναν μηδενικό χαρακτήρα κάπου μέσα τους). Σε αυτόν τον μηδενικό χαρακτήρα βασίζονται οι περισσότερες συναρτήσεις διαχείρισης των c-strings.
Και η ονομασία c-string αυτό ακριβώς σημαίνει: πίνακας χαρακτήρων που περιέχει τουλάχιστον έναν μηδενικό χαρακτήρα μέσα του (ο οποίος σηματοδοτεί το τρέχον μήκος του c-string).
Αν δεν περιέχει μηδενικό χαρακτήρα, τότε δεν είναι c-string, αλλά σκέτο string... απλώς οι 2 όροι πολλές συχνά χρησιμοποιούνται ως ισοδύναμοι στην C. Αν λοιπόν για παράδειγμα περάσεις στην puts ως όρισμα έναν πίνακα από χαρακτήρες χωρίς να έχεις εξασφαλίσει πως περιέχει κάπου μέσα του έναν μηδενικό χαρακτήρα, η puts() θα τυπώνει συνέχεια χαρακτήρες (ξεκινώντας από την αρχή του πίνακα που της πέρασες)... κάποια στιγμή θα βρει κάποιον μηεδινκό χαρακτήρα, αλλά κατά 99.999% θα έχει ξεπεράσει το μέγιστο μήκος που είχες ορίσει για τον πίνακα που της πέρασες... θα φτάσει δηλαδή με άλλα λόγια στον.. .γάμο του καραγκιόζη
Πάντως οι συμβολισμοί που χρησιμοποιεί η printf() και η scanf() είναι πολύ πιο βατοί να τους θυμάται κανείς... το %c είναι για έναν χαρακτήρα (από το char) ενώ το %s είναι για ολόκληρο string (από το string).
Και η ονομασία c-string αυτό ακριβώς σημαίνει: πίνακας χαρακτήρων που περιέχει τουλάχιστον έναν μηδενικό χαρακτήρα μέσα του (ο οποίος σηματοδοτεί το τρέχον μήκος του c-string).
Αν δεν περιέχει μηδενικό χαρακτήρα, τότε δεν είναι c-string, αλλά σκέτο string... απλώς οι 2 όροι πολλές συχνά χρησιμοποιούνται ως ισοδύναμοι στην C. Αν λοιπόν για παράδειγμα περάσεις στην puts ως όρισμα έναν πίνακα από χαρακτήρες χωρίς να έχεις εξασφαλίσει πως περιέχει κάπου μέσα του έναν μηδενικό χαρακτήρα, η puts() θα τυπώνει συνέχεια χαρακτήρες (ξεκινώντας από την αρχή του πίνακα που της πέρασες)... κάποια στιγμή θα βρει κάποιον μηεδινκό χαρακτήρα, αλλά κατά 99.999% θα έχει ξεπεράσει το μέγιστο μήκος που είχες ορίσει για τον πίνακα που της πέρασες... θα φτάσει δηλαδή με άλλα λόγια στον.. .γάμο του καραγκιόζη
Πάντως οι συμβολισμοί που χρησιμοποιεί η printf() και η scanf() είναι πολύ πιο βατοί να τους θυμάται κανείς... το %c είναι για έναν χαρακτήρα (από το char) ενώ το %s είναι για ολόκληρο string (από το string).