Ποια είναι η διαφορά μεταξύ ενός πίνακα χαρακτήρων και ενός c-string;


Απάντηση 1:

Μια συστοιχία char είναι ένα συνεχές εύρος μνήμης που αναλύεται ως bytes 8 bit. Είναι σταθερό σε μέγεθος κατά τη δημιουργία και εγγυάται την αποθήκευση ενός char σε κάθε byte.

Ένας χαρακτήρας σε αυτή την περίπτωση είναι οποιοσδήποτε δυαδικός ψηφίο 8-bit από00000000 (0x00 hex) έως 11111111 (0xFF hex).

char array [100]. / * 100 χαρακτήρες πίνακα [0] σε πίνακα [99] * /

Μια αλυσίδα C χρησιμοποιεί μια συστοιχία char για αποθήκευση. Μια σειρά C μπορεί να είναι από το 0 έως το μήκος της συστοιχίας μείον 1 χαρακτήρες.

Για να είναι καλά διαμορφωμένη, ο πίνακας μπορεί να περιέχει μόνο ένα υποσύνολο bytes που αντιπροσωπεύει έγκυρα σύμβολα στο σύνολο χαρακτήρων που πρόκειται να χρησιμοποιηθεί. Συχνά αυτό είναι ASCII ή UTF-8.Κάποιο άλλο byte μπορεί να μην είναι έγκυρο κατά την εκτύπωση ή την ερμηνεία της συμβολοσειράς.

Η συμβολοσειρά θα έχει μια ετικέτα (μεταβλητή) που είναι ένας χαρακτήρας δείκτη χαρακτήρα (char *) που περιέχει τη διεύθυνση του πίνακα.

Η συμβολοσειρά θα έχει ένα NULCHAR, ('\ 0', 0x00 hex) που τερματίζει τη συμβολοσειρά, μετά τον τελευταίο χαρακτήρα της συμβολοσειράς.

char s [10]. char * t = & s; strncpy (t, "012345678 \ 0", 10)

Μια "άμεση συμβολοσειρά" γράφεται σε διπλά εισαγωγικά στον πηγαίο κώδικα και προκαλεί τη δημιουργία ενός συστοιχείου char με τους χαρακτήρες που συμπληρώνονται και τοποθετείται σε μια ειδική θέση μνήμης μόνο για ανάγνωση και ένας δείκτης σε αυτό επιστρέφεται. Αυτό είναι "σύνταξη ζάχαρη" από τον μεταγλωττιστή και καθιστά απλό στη χρήση τέτοιες χορδές. Ένα NULCHAR προσαρτάται αυτόματα στη συστοιχία για να γίνει μια καλά διαμορφωμένη σειρά.

char * s = "μια άμεση σειρά"; printf ("% s \ n), s).

Όλες οι τυπικές λειτουργίες συμβολοσειράς της βιβλιοθήκης C περνούν τις συμβολοσειρές ως char * s και βασίζονται στο '\ 0' που υπάρχει.

Ένα "hack" που χρησιμοποιείται αρκετά παγκοσμίως είναι ότι η ετικέτα μιας συστοιχίας όταν προσπελάζεται διπλασιάζεται ως δείκτης στο πρώτο στοιχείο του πίνακα. και αντίστροφα.

char * x = "abcdefgh". printf ("x 4η χαρακτήρας:% c \ n", x [3]); x 4ος char: d / * βάλτε μια συμβολοσειρά σε μια συστοιχία char * / char str [100]; strncpy (str, "abcdefghijklmnop \ 0", 18). char * α = str; char * β = στρο + 7; printf ("% s \ n", α); abcdefghijklmnop printf ("% s \ n", β); hijklmnop

Παρά την ευελιξία αυτή, μια συστοιχία char και μια σειρά C δεν είναι άμεσα συμβατές.

char s [10]. s = "abcdefghi"; / * σφάλμα * / // σφάλμα: ασύμβατοι τύποι κατά την εκχώρηση στον τύπο 'char [10]' από τον τύπο 'char *' "abcdefghi" είναι μια άμεση συμβολοσειρά και επιλύεται σε ένα δείκτη στο 'a' Η αντιστοίχιση του s σε αυτό δεν λειτουργεί, καθώς οι συστοιχίες char δεν είναι δυνατές.

Οι πίνακες δεν είναι πραγματικά ένας πρώτος τάξη τύπου C. Δεν μπορούν να αντιγραφούν απευθείας, δεν έχουν λειτουργίες σε επίπεδο πίνακα κ.λπ. Όλα τα πράγματα που γίνονται με συστοιχίες στο C γίνονται στο ατομικό περιεχόμενο και όχι ως μονάδα.

char s [10]. char * x = "abcdefghi"; / * '\ 0' είναι στο τέλος * / strncpy (s, x, 10); / * αντιγράφει κάθε char στον πίνακα * /

Απάντηση 2:

Μια συστοιχία χαρακτήρων είναι μια δομή δεδομένων στη γλώσσα προγραμματισμού C: μια σειρά από bytes στη μνήμη στην οποία μπορείτε να αποθηκεύσετε χαρακτήρες. Μπορείτε να αποθηκεύσετε οποιονδήποτε χαρακτήρα (δηλαδή byte των 8-bit, αξία 0 έως 255) σε κάθε ένα από αυτά τα κελιά.

Μια συμβολοσειρά τύπου C (όπως αυτό που ερμηνεύω ως "c-string" στην ερώτησή σας σημαίνει) είναι ένας τρόπος να αντιπροσωπεύει μια "συμβολοσειρά" χαρακτήρων, που ορίζεται από τη γλώσσα C ως ένας αριθμός χαρακτήρων χωρίς το μηδενικό byte 0). Αυτό αντιπροσωπεύεται από τους ίδιους τους χαρακτήρες που ακολουθούνται από ένα μηδενικό byte, οπότε δεν χρειάζεται να αποθηκεύεται χωριστά το μήκος της συμβολοσειράς. Αντιστοιχίστε αυτό με τη συμβολοσειρά τύπου Pascal, όπου αντιπροσωπεύεται από έναν ακέραιο αριθμό 16-bit που δεν έχει υπογραφεί, ακολουθούμενος από τον αριθμό των bytes των πληροφοριών (έτσι ώστε το μήκος της συμβολοσειράς Pascal να είναι το πολύ 65535).

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

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