Περισσότερα
Πώς μπορώ να συνδέσω const/literal συμβολοσειρές στη C;
Εργάζομαι σε C και πρέπει να συνδέσω μερικά πράγματα.
Αυτή τη στιγμή έχω αυτό:
message = strcat("TEXT ", var);
message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));
Τώρα αν έχετε εμπειρία στη C είμαι σίγουρος ότι αντιλαμβάνεστε ότι αυτό σας δίνει ένα σφάλμα τμηματοποίησης όταν προσπαθείτε να το εκτελέσετε. Έτσι, πώς μπορώ να το παρακάμψω αυτό;
321
3
Στη C, οι "strings" είναι απλοί πίνακες
char
. Επομένως, δεν μπορείτε να τις συνδέσετε άμεσα με άλλες "συμβολοσειρές".Μπορείτε να χρησιμοποιήσετε τη συνάρτηση
strcat
, η οποία προσθέτει τη συμβολοσειρά που υποδεικνύεται από τηνsrc
στο τέλος της συμβολοσειράς που υποδεικνύεται από τηνdest
:Ακολουθεί ένα παράδειγμα από το cplusplus.com:
Για την πρώτη παράμετρο, πρέπει να δώσετε τον ίδιο τον απομονωτή προορισμού. Ο απομονωτής προορισμού πρέπει να είναι ένας απομονωτής πίνακα char. Π.χ:
char buffer[1024];
Φροντίστε ότι η πρώτη παράμετρος έχει αρκετό χώρο για να αποθηκεύσει αυτό που προσπαθείτε να αντιγράψετε σε αυτήν. Αν έχετε στη διάθεσή σας, είναι ασφαλέστερο να χρησιμοποιείτε συναρτήσεις όπως:
strcpy_s
καιstrcat_s
όπου πρέπει να καθορίσετε ρητά το μέγεθος του buffer προορισμού.Σημείωση: Ένα αλφαριθμητικό δεν μπορεί να χρησιμοποιηθεί ως buffer, καθώς είναι μια σταθερά. Έτσι, πρέπει πάντα να διαθέτετε έναν πίνακα char για τον απομονωτή.
Η τιμή επιστροφής του
strcat
μπορεί απλά να αγνοηθεί, επιστρέφει απλώς τον ίδιο δείκτη που είχε περάσει ως πρώτο όρισμα. Υπάρχει για λόγους ευκολίας και σας επιτρέπει να κάνετε αλυσιδωτές κλήσεις σε μία γραμμή κώδικα:Έτσι, το πρόβλημά σας θα μπορούσε να λυθεί ως εξής:
Είναι απροσδιόριστη συμπεριφορά η προσπάθεια τροποποίησης των αλφαριθμητικών, κάτι που συμβαίνει με κάτι τέτοιο:
θα προσπαθήσει να το κάνει. Θα προσπαθήσει να προσθέσει το αλφαριθμητικό
name
στο τέλος του αλφαριθμητικού"Hello, "
, το οποίο δεν είναι καλά ορισμένο.Δοκιμάστε κάτι τέτοιο. Επιτυγχάνει αυτό που φαίνεται να προσπαθείτε να κάνετε:
Αυτό δημιουργεί μια περιοχή buffer που επιτρέπεται να τροποποιηθεί και στη συνέχεια αντιγράφει τόσο το αλφαριθμητικό όσο και άλλο κείμενο σε αυτήν. Απλά να είστε προσεκτικοί με τις υπερχειλίσεις του buffer. Αν ελέγχετε τα δεδομένα εισόδου (ή τα ελέγχετε εκ των προτέρων), είναι μια χαρά να χρησιμοποιείτε buffers σταθερού μήκους όπως εγώ.
Διαφορετικά, θα πρέπει να χρησιμοποιήσετε στρατηγικές μετριασμού, όπως η διάθεση αρκετής μνήμης από το σωρό για να διασφαλίσετε ότι μπορείτε να το χειριστείτε. Με άλλα λόγια, κάτι σαν:
Το πρώτο όρισμα της strcat() πρέπει να είναι ικανό να χωρέσει αρκετό χώρο για το συνυφασμένο αλφαριθμητικό. Επομένως, διαθέστε ένα buffer με αρκετό χώρο για να λάβει το αποτέλεσμα.
Η strcat() θα συνδέσει το δεύτερο όρισμα με το πρώτο όρισμα και θα αποθηκεύσει το αποτέλεσμα στο πρώτο όρισμα, το επιστρεφόμενο char* είναι απλά αυτό το πρώτο όρισμα και μόνο για τη δική σας ευκολία.
Δεν λαμβάνετε ένα νεοδιατιθέμενο αλφαριθμητικό με το πρώτο και το δεύτερο όρισμα ενωμένα, το οποίο'θα υπέθετα ότι περιμένατε με βάση τον κώδικά σας.