37 votes

NUL char dans les chaînes de caractères en C++

Dans le code ci-dessous je suis en train de remplacer le premier personnage avec '\0'.

Je m'attendais à imprimer une chaîne vide, mais à la sortie il omet juste que et affiche le reste des personnages.

int main()
{
    string str;
    cin >> str;

    str[0] = '\0';

    cout << str << "\n";
    return 0;
}

SORTIE :

   testing
   esting

Comment puis-je mettre fin à la chaîne en C++?

PS: j'ai essayé cette approche de la résiliation de la chaîne dans une autre question à laquelle j'ai besoin de résilier entre les deux.

51voto

Marius Bancila Points 9184

std::string n'est pas une chaîne terminée par null. Si vous voulez vider utiliser l' clear() méthode. Si vous souhaitez supprimer un élément de la chaîne de l'utilisation de l' erase() méthode.

35voto

QuestionC Points 1490

Il existe deux approches pour les chaînes de caractères.

En C, les chaînes sont égales à zéro terminée, ce qui signifie le '\0' indique la fin de la chaîne, qui est ce que l'on attend.

C++ (et de la plupart des langues) utilise des chaînes comptées, ce qui signifie la fin de la chaîne est indexé, donc, l'ajout de terminateur null à la chaîne de ne pas y mettre fin. '\0' est un non-impression de caractères, de sorte que lorsque vous imprimez, vous obtenez le comportement que vous voyez. Si vous souhaitez manipuler des std::longueur de la chaîne, vous devez utiliser les std::string méthodes (http://www.cplusplus.com/reference/string/string/).

C++ ne se soucie pas de terminateur null pour les chaînes. Ils sont juste utilisés pour les C de compatibilité.

D'ailleurs, ce qui devrait avoir le comportement que vous attendiez.

cout<<str.c_str()<<"\n";

Voir aussi

Pourquoi null cordes? Ou: null vs caractères + stockage de longueur

Quelle est la justification pour les chaînes vides?

14voto

Johann Gerell Points 10649

Vous pensez que vous avez obtenu

testing
esting

en sortie, mais que vous avez

testing
 esting
^
|
+-- "empty" \0 char

parce que l' std::string a encore de la longueur de "test", vient d'être remplacé, le premier caractère 't' avec '\0'. Lors de l' std::cout obtient la chaîne, elle regarde la chaîne de caractères de longueur et sorties de tous ses personnages, ce qui rend le '\0' provoquer un "vide", la fente de sortie.

Pour bien dégager la chaîne, préfèrent l'appeler std::string::clear(). Aussi est - std::string::reset(0), mais il n'est pas aussi expressif (vous pouvez même attribuer une chaîne vide... frisson). La mise en œuvre peut ou ne peut pas utiliser un '\0' à tous, donc ne pensez pas que comme un moyen de jouer avec l'observées à l'extérieur de la représentation.

10voto

40two Points 8224

Un std::string ressemble à peu près la fonctionnalité d'un std::vector. Si vous souhaitez effacer tous les éléments de votre std::string vous pouvez utiliser std::string::clear

#include <iostream>
#include <string>

int main() {
  std::string str("testing");
  std::cout << str << std::endl;
  str.clear();
  std::cout << str << std::endl;
}

Si vous souhaitez supprimer un caractère à partir de votre chaîne (par exemple, le 1er personnage), vous pouvez utiliser std::string::erase:

#include <iostream>
#include <string>

int main() {
  std::string str("testing");
  std::cout << str << std::endl;
  str.erase(str.begin());
  std::cout << str << std::endl;
}

Si vous souhaitez supprimer des caractères particuliers à partir de votre chaîne, vous pouvez, comme dans le cas de l' std::vector, utiliser le erase-remove idiome:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
  std::string str("testing");
  std::cout << str << std::endl;
  str.erase(std::remove_if(str.begin(), str.end(), [](char const &c){ return c == 't'; }), str.end());
  std::cout << str << std::endl;
}

4voto

Selon le std::string mise en œuvre, le [] de retour à la référence pour le personnage en position donnée dans l'intérieur char tableau. Lorsque vous définissez comme str[8]= ‘\0' qu'il définit. Vous pouvez le vérifier en appelant str.c_str() fonction. Il retourner le tableau interne.

Cependant, Le cout lit des caractères sans les caractères null dans le milieu. C'est la raison pour laquelle la sortie.

const_reference operator[](size_type __n) const
{
    return *(_M_start + __n);
}

reference operator[](size_type __n)
{
    return *(_M_start + __n);
}

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