Θέλω να μετατρέψω ένα std::string σε τύπο δεδομένων **char* ή char[]**.
std::string str = "string";
char* chr = str;
Αποτελέσματα: "error: cannot convert 'std::string' to 'char' ... ".
Ποιες μέθοδοι είναι διαθέσιμες για να γίνει αυτό;
Δεν θα μετατραπεί αυτόματα (δόξα τω Θεώ). Θα πρέπει να χρησιμοποιήσετε τη μέθοδο c_str()
για να λάβετε την έκδοση συμβολοσειράς C.
std::string str = "string";
const char *cstr = str.c_str();
Σημειώστε ότι επιστρέφει ένα const char *
- δεν επιτρέπεται να αλλάξετε το αλφαριθμητικό τύπου C που επιστρέφει η c_str()
. Αν θέλετε να το επεξεργαστείτε θα πρέπει πρώτα να το αντιγράψετε:
std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
Ή στη σύγχρονη C++:
std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);
Αν θέλετε απλώς μια συμβολοσειρά τύπου C που να αναπαριστά το ίδιο περιεχόμενο:
char const* ca = str.c_str(),
Αν θέλετε ένα αλφαριθμητικό τύπου C με νέο περιεχόμενο, ένας τρόπος (δεδομένου ότι δεν γνωρίζετε το μέγεθος του αλφαριθμητικού κατά τη μεταγλώττιση) είναι η δυναμική κατανομή:
char* ca = new char[str.size()+1],
std::copy(str.begin(), str.end(), ca),
ca[str.size()] = '\0',
Μην ξεχάσετε να το διαγράψετε[]
αργότερα.
Αν θέλετε αντί αυτού έναν στατικά δεσμευμένο πίνακα περιορισμένου μήκους:
// μέγιστος αριθμός χαρακτήρων
char ca[MAX] = {},
std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca),
Η std::string
δεν μετατρέπει σιωπηρά σε αυτούς τους τύπους για τον απλό λόγο ότι η ανάγκη να το κάνει αυτό είναι συνήθως μια σχεδιαστική οσμή. Βεβαιωθείτε ότι το χρειάζεστε πραγματικά.
Αν χρειάζεστε οπωσδήποτε ένα char*
, ο καλύτερος τρόπος είναι πιθανώς:
vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector