Πώς μπορώ να συνδέσω const/literal συμβολοσειρές στη C;

Εργάζομαι σε C και πρέπει να συνδέσω μερικά πράγματα.

Αυτή τη στιγμή έχω αυτό:

message = strcat("TEXT ", var);

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

Τώρα αν έχετε εμπειρία στη C είμαι σίγουρος ότι αντιλαμβάνεστε ότι αυτό σας δίνει ένα σφάλμα τμηματοποίησης όταν προσπαθείτε να το εκτελέσετε. Έτσι, πώς μπορώ να το παρακάμψω αυτό;

Λύση

Στη C, οι "strings" είναι απλοί πίνακες char. Επομένως, δεν μπορείτε να τις συνδέσετε άμεσα με άλλες "συμβολοσειρές".

Μπορείτε να χρησιμοποιήσετε τη συνάρτηση strcat, η οποία προσθέτει τη συμβολοσειρά που υποδεικνύεται από την src στο τέλος της συμβολοσειράς που υποδεικνύεται από την dest:

char *strcat(char *dest, const char *src);

Ακολουθεί ένα παράδειγμα από το cplusplus.com:

char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");

Για την πρώτη παράμετρο, πρέπει να δώσετε τον ίδιο τον απομονωτή προορισμού. Ο απομονωτής προορισμού πρέπει να είναι ένας απομονωτής πίνακα char. Π.χ: char buffer[1024];

Φροντίστε ότι η πρώτη παράμετρος έχει αρκετό χώρο για να αποθηκεύσει αυτό που προσπαθείτε να αντιγράψετε σε αυτήν. Αν έχετε στη διάθεσή σας, είναι ασφαλέστερο να χρησιμοποιείτε συναρτήσεις όπως: strcpy_s και strcat_s όπου πρέπει να καθορίσετε ρητά το μέγεθος του buffer προορισμού.

Σημείωση: Ένα αλφαριθμητικό δεν μπορεί να χρησιμοποιηθεί ως buffer, καθώς είναι μια σταθερά. Έτσι, πρέπει πάντα να διαθέτετε έναν πίνακα char για τον απομονωτή.

Η τιμή επιστροφής του strcat μπορεί απλά να αγνοηθεί, επιστρέφει απλώς τον ίδιο δείκτη που είχε περάσει ως πρώτο όρισμα. Υπάρχει για λόγους ευκολίας και σας επιτρέπει να κάνετε αλυσιδωτές κλήσεις σε μία γραμμή κώδικα:

strcat(strcat(str, foo), bar);

Έτσι, το πρόβλημά σας θα μπορούσε να λυθεί ως εξής:

char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
Σχόλια (14)

Είναι απροσδιόριστη συμπεριφορά η προσπάθεια τροποποίησης των αλφαριθμητικών, κάτι που συμβαίνει με κάτι τέτοιο:

strcat ("Hello, ", name);

θα προσπαθήσει να το κάνει. Θα προσπαθήσει να προσθέσει το αλφαριθμητικό name στο τέλος του αλφαριθμητικού "Hello, ", το οποίο δεν είναι καλά ορισμένο.

Δοκιμάστε κάτι τέτοιο. Επιτυγχάνει αυτό που φαίνεται να προσπαθείτε να κάνετε:

char message[1000];
strcpy (message, "TEXT ");
strcat (message, var);

Αυτό δημιουργεί μια περιοχή buffer που επιτρέπεται να τροποποιηθεί και στη συνέχεια αντιγράφει τόσο το αλφαριθμητικό όσο και άλλο κείμενο σε αυτήν. Απλά να είστε προσεκτικοί με τις υπερχειλίσεις του buffer. Αν ελέγχετε τα δεδομένα εισόδου (ή τα ελέγχετε εκ των προτέρων), είναι μια χαρά να χρησιμοποιείτε buffers σταθερού μήκους όπως εγώ.

Διαφορετικά, θα πρέπει να χρησιμοποιήσετε στρατηγικές μετριασμού, όπως η διάθεση αρκετής μνήμης από το σωρό για να διασφαλίσετε ότι μπορείτε να το χειριστείτε. Με άλλα λόγια, κάτι σαν:

const static char TEXT[] = "TEXT ";

// Make *sure* you have enough space.

char *message = malloc (sizeof(TEXT) + strlen(var) + 1);
if (message == NULL)
     handleOutOfMemoryIntelligently();
strcpy (message, TEXT);
strcat (message, var);

// Need to free message at some point after you're done with it.
Σχόλια (5)

Το πρώτο όρισμα της strcat() πρέπει να είναι ικανό να χωρέσει αρκετό χώρο για το συνυφασμένο αλφαριθμητικό. Επομένως, διαθέστε ένα buffer με αρκετό χώρο για να λάβει το αποτέλεσμα.

char bigEnough[64] = "";

strcat(bigEnough, "TEXT");
strcat(bigEnough, foo);

/* and so on */

Η strcat() θα συνδέσει το δεύτερο όρισμα με το πρώτο όρισμα και θα αποθηκεύσει το αποτέλεσμα στο πρώτο όρισμα, το επιστρεφόμενο char* είναι απλά αυτό το πρώτο όρισμα και μόνο για τη δική σας ευκολία.

Δεν λαμβάνετε ένα νεοδιατιθέμενο αλφαριθμητικό με το πρώτο και το δεύτερο όρισμα ενωμένα, το οποίο'θα υπέθετα ότι περιμένατε με βάση τον κώδικά σας.

Σχόλια (0)