95 votes

Quelle est l'utilité de la fonction c_str() ?

Je comprends c_str convertit une chaîne, qui peut être ou non à terminaison nulle, en une chaîne à terminaison nulle.

Est-ce vrai ? Pouvez-vous donner des exemples ?

107voto

Jon Points 194296

c_str renvoie un const char* qui pointe vers une chaîne de caractères à terminaison nulle (c'est-à-dire une chaîne de caractères de style C). Elle est utile lorsque vous souhaitez transmettre le "contenu"¹ d'une chaîne de caractères. std::string à une fonction qui s'attend à travailler avec une chaîne de style C.

Prenons l'exemple de ce code :

std::string string("Hello, World!");
std::size_t pos1 = string.find_first_of('w');

std::size_t pos2 = static_cast<std::size_t>(std::strchr(string.c_str(), 'w') - string.c_str());

if (pos1 == pos2) {
    std::printf("Both ways give the same result.\n");
}

Voyez-le en action .

Notes :

¹ Ce n'est pas tout à fait vrai car un std::string (contrairement à une chaîne de caractères en C) peut contenir les éléments suivants \0 caractère. Si c'est le cas, le code qui reçoit la valeur de retour de c_str() sera trompé en pensant que la chaîne est plus courte qu'elle ne l'est en réalité, puisqu'il interprétera \0 comme fin de la chaîne.

71voto

hkBattousai Points 1930

En C++, vous définissez vos chaînes de caractères comme suit

std::string MyString;

au lieu de

char MyString[20]; .

Lorsque vous écrivez du code C++, vous rencontrez certaines fonctions C qui requièrent une chaîne C comme paramètre.
Comme ci-dessous :

void IAmACFunction(int abc, float bcd, const char * cstring);

Il y a maintenant un problème. Vous travaillez avec C++ et vous utilisez std::string les variables de type chaîne de caractères. Mais cette fonction C demande une chaîne de caractères C. Comment convertir votre std::string à une chaîne de caractères C standard ?

Comme ceci :

std::string MyString;
// ...
MyString = "Hello world!";
// ...
IAmACFunction(5, 2.45f, MyString.c_str());

C'est ce que c_str() est destiné à.

Il convient de noter que, pour les std::wstring cordes, c_str() renvoie un const w_char * .

9voto

Daniel Mošmondor Points 10926

La plupart des ancien Les fonctions C++ et C, lorsqu'elles traitent des chaînes de caractères, utilisent const char* .

Avec STL y std::string , string.c_str() est introduite pour pouvoir convertir les données de std::string à const char* .

Cela signifie que si vous promettez de ne pas modifier le tampon, vous pourrez utiliser le contenu de la chaîne en lecture seule. PROMESSE = constante char*

1 votes

Il n'y a rien de tel qu'une stl::string . En fait, il n'existe même pas de "STL", si ce n'est dans un musée quelque part.

1 votes

@Kerrek SB : STL est (était ?) utilisé comme synonyme de la bibliothèque standard C++.

0 votes

Voici un exemple à partir de 2020. Ou peut-être est-ce dû à vieux livres ?

8voto

Linkon Ruhul Points 85

En programmation C/C++, il existe deux types de chaînes : les chaînes C et les chaînes standard. Avec les <string> nous pouvons utiliser les chaînes standard. D'un autre côté, les chaînes C sont juste un tableau de caractères normaux. Ainsi, pour convertir une chaîne standard en chaîne C, nous utilisons la fonction c_str() fonction.

Par exemple

// A string to a C-style string conversion //

const char *cstr1 = str1.c_str();
cout<<"Operation: *cstr1 = str1.c_str()"<<endl;
cout<<"The C-style string c_str1 is: "<<cstr1<<endl;
cout<<"\nOperation: strlen(cstr1)"<<endl;
cout<<"The length of C-style string str1 = "<<strlen(cstr1)<<endl;

Et le résultat sera,

Operation: *cstr1 = str1.c_str()
The C-style string c_str1 is: Testing the c_str

Operation: strlen(cstr1)
The length of C-style string str1 = 17

7voto

CadentOrange Points 1321

C_str() convertit une chaîne C++ en une chaîne de style C qui est essentiellement un tableau d'octets à terminaison nulle. Vous l'utilisez lorsque vous voulez passer une chaîne C++ dans une fonction qui attend une chaîne de style C (par exemple, un grand nombre de fonctions de la bibliothèque Win32 API, POSIX les fonctions de style, etc.)

5 votes

Je ne dirais pas "converti". La fonction "donne accès" à un tableau de caractères en lecture seule -- très probablement un tableau qui a toujours existé dans l'implémentation de la fonction std::string pour commencer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X