Pourquoi je ne peux pas couper une chaîne?


143

Pourquoi je ne peux pas cout stringaimer ça:

string text ;
text = WordList[i].substr(0,20) ;
cout << "String is  : " << text << endl ;

Lorsque je fais cela, j'obtiens l'erreur suivante:

Erreur 2 erreur C2679: binaire '<<': aucun opérateur trouvé qui prend un opérande de droite de type 'std :: string' (ou il n'y a pas de conversion acceptable) c: \ users \ mollasadra \ documents \ visual studio 2008 \ projets \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

C'est incroyable, que même cela ne fonctionne pas:

string text ;
text = "hello"  ;
cout << "String is  : " << text << endl ;

Pouvez-vous modifier le message d'erreur?
Troyen

1
Avez-vous #include <iostream>?
Konerak

pas assez d'informations. quelle est l'erreur
alexD

J'ai fait ça. mais encore une fois, j'ai un problème.
Ata

Pouvez-vous publier le fichier entier? Nous ne savons pas si vous appelez cela dans une fonction, si vous avez inclus les bonnes choses, etc ...
Konerak

Réponses:


241

Vous devez inclure

#include <string>
#include <iostream>

7
et aussi using namespace stdou using std::cout; using std::endl;
fardjad

2
Oui, mais je suppose que c'est inclus, car il n'y a pas d'erreur sur string text;l'édition (erreur ajoutée) dit, que ce n'est pas le problème mais l'en- stringtête manquant .
Kiril Kirov

57
+1: De nombreux en-têtes STL dans Visual C ++ (y compris <iostream>) tirent une définition de la std::basic_stringclasse (car ils incluent indirectement l'en-tête <xstring> défini par l'implémentation ( ne l'incluent jamais directement )). Bien que cela vous permette d'utiliser la classe de chaîne, la valeur pertinente operator<<est définie dans l'en-tête <string> lui-même, vous devez donc l'inclure manuellement. S'appuyant également sur d'autres en-têtes pour inclure indirectement la définition des std::basic_stringtravaux dans VC ++, mais cela ne fonctionnera pas sur tous les compilateurs.
Sven

6
Sven- Votre commentaire est génial! J'ai eu un problème similaire à celui de l'interrogateur, le compilateur a déclaré que l'opérateur >> n'était pas défini pour les types std :: cin et std :: string. Il s'avère que j'avais <iostream> mais j'avais oublié <string>. J'ai l'habitude de travailler sous linux w / gcc qui se serait plaint que std :: string n'est pas défini. Votre commentaire explique parfaitement pourquoi nous avons plutôt reçu la plainte concernant l'opérateur. Merci!!
Daniel Goldfarb

2
Cela marche. J'ai manqué la ligne #include <string> dans mon code. Merci.
Hao Nguyen

11

Vous devez en stdquelque sorte référencer l'espace de noms du cout . Par exemple, insérez

using std::cout;
using std::endl;

en plus de la définition de votre fonction ou du fichier.


6

Il y a plusieurs problèmes avec votre code:

  1. WordListn'est défini nulle part. Vous devez le définir avant de l'utiliser.
  2. Vous ne pouvez pas simplement écrire du code en dehors d'une fonction comme celle-ci. Vous devez le mettre dans une fonction.
  3. Vous devez le faire #include <string>avant de pouvoir utiliser la classe de chaîne et iostream avant d'utiliser coutou endl.
  4. string, coutet endlvivent dans l' stdespace de noms, vous ne pouvez donc pas y accéder sans les préfixer à std::moins que vous n'utilisiez la usingdirective pour les mettre d'abord dans la portée.

aucun d'entre eux n'a fonctionné pour moi, il semble que le problème soit avec substr
Ata

1

Les réponses ci-dessus sont bonnes, mais si vous ne souhaitez pas ajouter de chaîne include, vous pouvez utiliser ce qui suit

ostream& operator<<(ostream& os, string& msg)
{
os<<msg.c_str();

return os;
}

0

Utilisez c_str () pour convertir la chaîne std :: string en const char *.

cout << "String is  : " << text.c_str() << endl ;

-1

Vous n'avez pas à faire référence std::coutou std::endlexplicitement.
Ils sont tous deux inclus dans le namespace std. using namespace stdau lieu d'utiliser l'opérateur de résolution de portée à ::chaque fois, c'est plus facile et plus propre.

#include<iostream>
#include<string>
using namespace std;

5
Bienvenue dans StackOverflow, vous ne l'avez peut-être pas remarqué, mais cela a été abordé dans l'un des commentaires de la réponse acceptée.
Andon M. Coleman

-3

Si vous utilisez le système Linux, vous devez ajouter

using namespace std;

Sous les en-têtes

Si Windows, assurez-vous de mettre correctement les en-têtes #include<iostream.h>

#include<string.h>

Reportez-vous cela fonctionne parfaitement.

#include <iostream>
#include <string>

int main ()
{
std::string str="We think in generalities, but we live in details.";
                                       // (quoting Alfred N. Whitehead)

  std::string str2 = str.substr (3,5);     // "think"

   std::size_t pos = str.find("live");      // position of "live" in str

  std::string str3 = str.substr (pos);     
// get from "live" to the end

  std::cout << str2 << ' ' << str3 << '\n';

  return 0;
}

using namespace std;n'a rien à voir avec le système d'exploitation cible linux. De même, l'ajout .hde l'include n'a rien à voir avec le système d'exploitation cible qui est Windows, #include <iostream>et #include <string>fonctionnera sur Windows.
StaticBeagle
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.