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.