Perché non riesco a tagliare una stringa?


143

Perché non mi cout stringpiace questo:

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

Quando lo faccio, ricevo il seguente errore:

Errore 2 errore C2679: binario '<<': nessun operatore trovato che accetta un operando di destra di tipo 'std :: string' (o non esiste una conversione accettabile) c: \ utenti \ mollasadra \ documenti \ visual studio 2008 \ progetti \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

È sorprendente che anche questo non funzioni:

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

Puoi modificarlo nel messaggio di errore?
Troyen,

1
Vero #include <iostream>?
Konerak,

informazioni insufficienti. qual è l'errore
alexD,

L'ho fatto. ma ancora, ho un problema.
Ata,

Puoi pubblicare l'intero file? Non sappiamo se lo stai chiamando in una funzione, se hai incluso le cose giuste, ecc ...
Konerak,

Risposte:


241

Devi includere

#include <string>
#include <iostream>

7
e anche using namespace stdo using std::cout; using std::endl;
Fardjad,

2
Sì, ma immagino che sia incluso, poiché non c'è nessun errore string text;anche sulla modifica (errore aggiunto) dice che questo non è il problema ma l' stringintestazione mancante .
Kiril Kirov,

57
+1: Molte intestazioni STL in Visual C ++ (incluso <iostream>) std::basic_stringinseriscono una definizione della classe (perché includono indirettamente l'intestazione <xstring> definita dall'implementazione ( non includerla mai direttamente )). Sebbene ciò ti consenta di utilizzare la classe stringa, il relativo operator<<è definito nell'intestazione <string> stessa, quindi devi includerlo manualmente. Affidandosi anche ad altre intestazioni per includere indirettamente la definizione di std::basic_stringlavori in VC ++, ma non funzionerà su tutti i compilatori.
Sven,

6
Sven- Il tuo commento è fantastico! Ho avuto un problema simile a questo interrogatore, il compilatore ha detto che l'operatore >> non è stato definito per i tipi std :: cin e std :: string. Si scopre che avevo <iostream> ma avevo dimenticato <string>. Sono abituato a lavorare su Linux con gcc che si sarebbe lamentato del fatto che std :: string non è definito. Il tuo commento spiega perfettamente perché abbiamo invece ricevuto il reclamo sull'operatore. Grazie!!
Daniel Goldfarb,

2
Questo funziona Ho perso la riga #include <string> nel mio codice. Grazie.
Hao Nguyen,

11

È necessario fare riferimento in stdqualche modo allo spazio dei nomi di Cout. Ad esempio, inserire

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

sopra la definizione della funzione o il file.


6

Esistono diversi problemi con il codice:

  1. WordListnon è definito da nessuna parte. Dovresti definirlo prima di usarlo.
  2. Non puoi semplicemente scrivere codice al di fuori di una funzione come questa. Devi metterlo in funzione.
  3. È necessario #include <string>prima di poter utilizzare la classe di stringa e iostream prima di utilizzare couto endl.
  4. string, coutE endldal vivo nel stdnamespace, in modo non è possibile accedere senza anteponendo std::a meno che non si utilizza la usingdirettiva per portarli in ambito prima.

nessuno di loro ha funzionato per me, sembra che il problema sia con substr
Ata,

1

Le risposte sopra sono buone ma se non si desidera aggiungere l'inclusione di stringhe, è possibile utilizzare quanto segue

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

return os;
}

0

Utilizzare c_str () per convertire std :: string in const char *.

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

-1

Non è necessario fare riferimento std::couto std::endlesplicitamente.
Entrambi sono inclusi nel namespace std. using namespace stdinvece di utilizzare l'operatore di risoluzione dell'ambito ::ogni volta rende più facile e pulito.

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

5
Benvenuto in StackOverflow, potresti non aver notato ma questo è stato risolto in uno dei commenti della risposta accettata.
Andon M. Coleman,

-3

Se si utilizza il sistema Linux, è necessario aggiungere

using namespace std;

Sotto le intestazioni

Se Windows, assicurati di inserire correttamente le intestazioni #include<iostream.h>

#include<string.h>

Segnala questo funziona perfettamente.

#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;non ha nulla a che fare con il sistema operativo di destinazione linux. Allo stesso modo, l'aggiunta .hdi alle inclusioni non ha nulla a che fare con il sistema operativo di destinazione che è Windows #include <iostream>e #include <string>funzionerà su Windows.
StaticBeagle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.