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 ;
À
la source
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>
Kiril Kirov
la source
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.

nperson325681
la source
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.
sepp2k
la source
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;
}
Maheswar Reddy
la source
0

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

cout << "String is  : " << text.c_str() << endl ;
Anthony.
la source
-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;
Ash Ghal
la source
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;
}
pratikpchpr
la source
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