Δημοσιεύτηκε: 05 Σεπ 2011, 23:35
Star_Light έγραψε:migf1 έγραψε:
...
1. Δυστυχως αυτα τα κομματια κωδικα... τα βλεπω πρωτη φορα και δεν τα καταλαβαινω... αυτα τα οποια περιεκλεισα με "-------"
ειδικα το "this is a test"[1]="h" δεν το εχω ξαναδει ποτε μου σαν ορισμο....
2. "Ο πιο γρήγορος τρόπος για να καταλάβετε σε αυτό το παράδειγμα πως το s δεν είναι string αλλά απλός δείκτης, είναι να κάνετε ένα: sizeof( s ); και να διαπιστώσετε πως το μέγεθός του δεν είναι το πλήθος των χαρακτήρων του string + 1 για τον μηδενικό χαρακτήρα, αλλά είναι 4 bytes (ή 8 bytes στις 64μπιτες πλατφόρμες) που απεικονίζει το μέγεθος του δείκτη s, που είναι ίδιο για όλους τους δείκτες!" αυτο λες.
Αλλα αρχικα δεν ξεκιναμε με εναν απλο δεικτη θελω να πω οτι ο δεικτης μας ειτε δειχνει εδω ειτε δειχνει εκει ειναι τοσο... επομενως αρχικα τον βάζω να δειχνει στον 1ο χαρακτηρα... μετα στον δευτερο... μετα στον τριτο κ.ο.κ ετσι ειχαμε πει τωρα πως θα αλλαξει ξαφνικα το μεγεθος του σε πληθος χαρακτηρων + 1 εκτος και αν εχουμε μιλησει για το αρχικο του μεγεθος....
Για αυτό ήθελα να το αφήσω ξεχωριστά αυτή την περίπτωση
Λοιπόν, για να τα απλοποιήσουμε λιγάκι, όταν θέλετε να ορίσετε strings να προτιμάτε τη σύνταξη πινάκων και για να είστε καλυμμένοι, να ορίζετε πάντα και το μέγιστο πλήθος χαρακτήρων τους μέσα στις αγκύλες, και για τον μηδενικό να γράφετε +1 για να καταλαβαίνεται αμέσως πόσοι είναι οι μέγιστοι ωφέλιμοι χαρακτήρες που μπορεί να φιλοξενήσει... όπως σας έχω δείξει...
- Κώδικας: Επιλογή όλων
char s[100+1]; // 100 ωφέλιμοι + '\0'
Και να τα αρχικοποιείται πάντα...
- Κώδικας: Επιλογή όλων
char s[100+1] = "bla bla";
Αν δεν θέλετε να τους δώσετε αρχική τιμή, τότε να τα αρχικοποιείτε με '\0' σε όλο το μέγιστο μήκος τους...
- Κώδικας: Επιλογή όλων
char s[100+1] = { '\0' };
Αν κάνετε πάντα κάποιο από τα τελευταία 2 παραδείγματα, τότε είστε καλυμμένοι σε ότι αφορά τον ορισμό των strings, και θα σας δίνουν πάντα κατανοητό αποτέλεσμα οι sizeof() και strlen()
Τώρα, αν θέλετε να ορίσετε δυναμικά ένα string, να το κάνετε πάντα ως εξής:
- Κώδικας: Επιλογή όλων
char *s = NULL;
s = calloc( 100+1, sizeof(char) );
...
if (s)
{
free(s);
s = NULL;
}
ή για πιο συνεπτυγμένα, ...
- Κώδικας: Επιλογή όλων
char *s = calloc( 100+1, sizeof(char) );
...
if (s)
{
free(s);
s = NULL;
}
Και είστε καλυμμένοι
Τέλος, αν θέλετε να χρησιμοποιήσετε string literals, τότε να τα ορίζετε ως σταθερές με #define στην αρχή, και μετά θα μπορείτε να χρησιμοποιείτε το όνομά του σαν να ήταν κανονικό string, με την προϋπόθεση πως δεν θα επιχειρήσετε να τροποποιήσετε τα περιεχόμενά του...
- Κώδικας: Επιλογή όλων
#define MESSAGE "bla bla" // string literal
int main( void )
{
...
printf("size = %ld, length = %ld\n, sizeof( MESSAGE ), strlen( MESSAGE ) );
...
}
Είμαστε ΟΚ τώρα; Αν όχι, πες μέχρι να τα ξεδιαλύνουμε.