2010-04-11 20 views
11
#include<string> 
... 
string in; 

//How do I store a string from stdin to in? 
// 
//gets(in) - 16 cannot convert `std::string' to `char*' for argument `1' to 
//char* gets (char*)' 
// 
//scanf("%s",in) also gives some weird error 

Analogamente, come si scrive in su stdout o su un file ??Come leggere e scrivere una stringa STL C++?

risposta

21

Si sta tentando di combinare l'I/O in stile C con i tipi C++. Quando usi C++ dovresti usare i flussi std :: cin e std :: cout per l'input e l'output della console.

#include<string> 
#include<iostream> 
... 
std::string in; 
std::string out("hello world"); 

std::cin >> in; 
std::cout << out; 

Ma quando si legge una stringa std :: cin smette di leggere non appena incontra uno spazio o una nuova riga. Si consiglia di utilizzare getline per ottenere un'intera riga di input dalla console.

std::getline(std::cin, in); 

Si utilizzano gli stessi metodi con un file (quando si tratta di dati non binari).

std::ofstream ofs('myfile.txt'); 

ofs << myString; 
0

C++ le stringhe devono essere letti e scritti utilizzando >> e << operatori e altri equivalenti C++. Tuttavia, se si desidera utilizzare scanf come in C, si può sempre leggere una stringa il modo in C++ e usa sscanf con esso:

std::string s; 
std::getline(cin, s); 
sscanf(s.c_str(), "%i%i%c", ...); 

Il modo più semplice per l'uscita di una stringa è con:

s = "string..."; 
cout << s; 

Ma printf funzionerà anche: [printf fisso]

printf("%s", s.c_str()); 

procedimento c_str() restituisce un puntatore a null-ter stringa ASCII minata, che può essere utilizzata da tutte le funzioni C standard.

+2

L'utilizzo del printf non è sicuro, dovrebbe essere 'printf ("% s ", s.c_str());' per evitare overflow del buffer. – LiraNuna

+0

Hai ragione, lo correggerò. –

3

Ci sono molti modi per leggere il testo da stdin in uno std::string. La cosa su std::string s è che crescono come necessario, che a sua volta significa che si riallocano. Internamente un std::string ha un puntatore a un buffer a lunghezza fissa. Quando il buffer è pieno e si richiede di aggiungere uno o più caratteri, l'oggetto std::string creerà un nuovo buffer più grande invece di quello vecchio e sposterà tutto il testo nel nuovo buffer.

Tutto questo per dire che se si conosce la lunghezza del testo che si sta per leggere in precedenza, è possibile migliorare le prestazioni evitando queste riallocazioni.

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

// ... 
    // if you don't know the length of string ahead of time: 
    string in(istreambuf_iterator<char>(cin), istreambuf_iterator<char>()); 

    // if you do know the length of string: 
    in.reserve(TEXT_LENGTH); 
    in.assign(istreambuf_iterator<char>(cin), istreambuf_iterator<char>()); 

    // alternatively (include <algorithm> for this): 
    copy(istreambuf_iterator<char>(cin), istreambuf_iterator<char>(), 
     back_inserter(in)); 

Tutto quanto sopra sarà copiare tutto il testo trovato in stdin, end-of-file fino. Se si desidera solo una singola linea, utilizzare std::getline():

#include <string> 
#include <iostream> 

// ... 
    string in; 
    while(getline(cin, in)) { 
     // ... 
    } 

Se si desidera un singolo carattere, utilizzare std::istream::get():

#include <iostream> 

// ... 
    char ch; 
    while(cin.get(ch)) { 
     // ... 
    } 
Problemi correlati