2009-09-24 14 views
111

Il seguente fallisce con l'errore prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’Come aggiungere un char a una std :: string?

int main() 
{ 
    char d = 'd'; 
    std::string y("Hello worl"); 
    y.append(d); // Line 5 - this fails 
    std::cout << y; 
    return 0; 
} 

Ho anche provato, quanto segue, che compila, ma si comporta in modo casuale in fase di esecuzione:

int main() 
{ 
    char d[1] = { 'd' }; 
    std::string y("Hello worl"); 
    y.append(d); 
    std::cout << y; 
    return 0; 
} 

Siamo spiacenti per questa domanda stupida, ma ho cercato in giro google, quello che ho potuto vedere sono solo "array di caratteri a char ptr", "PTR char a char allineamento", ecc

+0

Che cosa si intende fallendo? – decasteljau

+0

un errore del compilatore si..ho dimenticato qual è l'errore, ma è ragionevole. –

+2

Hai delle risposte migliori qui sotto, ma puoi fare in modo che il secondo esempio funzioni come questo char d [2] = {'d', 0}; o solo char d [2] = "d"; Fondamentalmente, è necessario un 0 per terminare la stringa di stile c che si passa ad aggiungere – sbk

risposta

149
y += d; 

userei += operatore al posto di funzioni con nome.

+1

perché consideri + = meglio di push_back? È solo meno digitando o hai un'altra ragione? – Glen

+3

È meno digitante. In 'gcc',' basic_string :: operator + = 'è solo una chiamata in' push_back'. – eduffy

+2

È più IMO naturale per le stringhe. push_back è funzione contenitore e una stringa è specializzata in STL :) – AraK

43

Uso push_back():

std::string y("Hello worl"); 
y.push_back('d') 
std::cout << y; 
5

Prova l'operatore + = link text, metodo link text, o push_back() metodo link text

I link in questo post contengono anche esempi di come utilizzare le rispettive API append().

7

In aggiunta agli altri citati, uno dei costruttori di stringhe prende un carattere e il numero di ripetizioni per quel carattere. Quindi puoi usarlo per aggiungere un singolo carattere.

std::string s = "hell"; 
s += std::string(1, 'o'); 
-1

Se si utilizza il push_back non c'è nessuna chiamata per il costruttore stringa. Altrimenti creerà un oggetto stringa tramite casting, quindi aggiungerà il carattere in questa stringa all'altra stringa. Troppo disturbo per un carattere molto piccolo;)

+1

operatore + = (carattere c); è sovraccarico per le stringhe. Infatti, il costruttore di stringhe non accetta un carattere, vedi risposta Brian;) – AraK

16

Per aggiungere un char a un var std :: string utilizzando il metodo append, è necessario utilizzare questo sovraccarico:

std::string::append(size_type _Count, char _Ch) 

Edit: vi trovate giusto ho frainteso il parametro size_type, visualizzato nella guida contestuale. Questo è il numero di caratteri da aggiungere. Quindi la chiamata corretta è

s.append(1, d); 
non

s.append(sizeof(char), d); 

O il modo più semplice:

s += d; 
+0

Penso che l'uso di sizeof non sia semanticamente corretto qui (anche se capita di funzionare come sizeof (char) è sempre uno). Il metodo append è naturalmente più utile se vuoi aggiungere altre copie dello stesso personaggio !!!!!!!!!! – UncleBens

+1

Perché stai usando 'sizeof (char)' invece di '1'? Vuoi aggiungere esattamente una ripetizione di 'd', quindi basta dirlo. L'uso di 'sizeof' qui è fuorviante in quanto suggerisce che si debba dire' aggiungi 'la dimensione in byte del tipo di dati usato (che non è il caso). –

+0

Come ha detto lo Unclebens, il metodo append è davvero più utile quando si aggiunge lo stesso carattere molte volte. –

1

il problema con:

std::string y("Hello worl"); 
y.push_back('d') 
std::cout << y; 

è che si deve avere la 'd' come opp osed to using a name of a char, come char d = 'd'; O mi sbaglio?

0
str.append(10u,'d'); //appends character d 10 times 

Avviso ho scritto 10u e non 10 per il numero di volte che mi piacerebbe aggiungere il carattere; sostituire 10 con qualsiasi numero.

+3

Questo è già stato pubblicato circa quattro anni fa. – Mat

1
int main() 
{ 
    char d = 'd'; 
    std::string y("Hello worl"); 

    y += d; 
    y.push_back(d); 
    y.append(1, d); //appending the character 1 time 
    y.insert(y.end(), 1, d); //appending the character 1 time 
    y.resize(y.size()+1, d); //appending the character 1 time 
    y += std::string(1, d); //appending the character 1 time 
} 

Si noti che in tutti questi esempi si potrebbe avere utilizzato un carattere letterale direttamente: y += 'd';.

Il tuo secondo esempio quasi avrebbe funzionato, per motivi non correlati. char d[1] = { 'd'}; non ha funzionato, ma char d[2] = { 'd'}; (notare che la matrice è la dimensione due) sarebbe stata lavorata all'incirca come const char* d = "d"; e una stringa letterale può essere aggiunta: y.append(d);.

1

provare a utilizzare il D come puntatore y.append (* d)

+0

Questo è pericoloso poiché un singolo 'char' non è una stringa e non ha un terminatore null. Fare ciò causa un comportamento non definito. –

4

ho testare le varie proposte da loro esecuzione in un ciclo di grandi dimensioni. Ho usato microsoft visual studio 2015 come compilatore e il mio processore è un i7, 8Hz, 2GHz.

long start = clock(); 
    int a = 0; 
    //100000000 
    std::string ret; 
    for (int i = 0; i < 60000000; i++) 
    { 
     ret.append(1, ' '); 
     //ret += ' '; 
     //ret.push_back(' '); 
     //ret.insert(ret.end(), 1, ' '); 
     //ret.resize(ret.size() + 1, ' '); 
    } 
    long stop = clock(); 
    long test = stop - start; 
    return 0; 

Secondo questo test, i risultati sono i seguenti:

 operation    time(ms)   note 
------------------------------------------------------------------------ 
append      66015 
+=       67328  1.02 time slower than 'append' 
resize      83867  1.27 time slower than 'append' 
push_back & insert   90000  more than 1.36 time slower than 'append' 

Conclusione

+= sembra più comprensibile, ma se si mente circa la velocità, l'uso aggiungono

+0

Affinché una risposta del genere sia significativa, dovresti dire almeno che cosa stai usando il compilatore, perché tali cose potrebbero variare di molto. Parlare del tuo processore può essere anche grandioso, per avere una stima approssimativa dell'impatto che questo potrebbe avere. – akaltar

+0

Ho usato Visual Studio 2015. Cercherò gcc per fare altri test. Il mio processore è i7, 8 cuori, 2.20 Ghz .... Ma qualunque sia il mio processore non avrà alcun impatto sull'implementazione di std :: string .. . tranne se alcuni di questi metodi sono multithread e alcuni no. –

+0

A volte ha un impatto, specialmente se si visualizzano i tempi in millisecondi. Invece è possibile visualizzare in percentuale rispetto al metodo più veloce (quindi la velocità effettiva del processore è irrilevante). Spostare i dati dal commento alla risposta, questa è solo un'etichetta generale di StackExchange. Altrimenti bella risposta. – akaltar

Problemi correlati