2009-09-24 11 views
111

La siguiente falla con el error prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’Cómo agregar un char a std :: string?

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

También probé, lo siguiente, que compila pero se comporta de forma aleatoria en tiempo de ejecución:

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

Lo siento por esta pregunta tonta, pero yo he buscado en todo Google, lo que pude ver son sólo "matriz de caracteres a ptr char", "ptr carbón a char matriz", etc.

+0

¿Qué quiere decir por el fracaso? – decasteljau

+0

un error del compilador sí ... Olvidé cuál es el error, pero es razonable. –

+2

Tienes mejores respuestas a continuación, pero puedes hacerte el segundo ejemplo que funciona así char d [2] = {'d', 0}; o simplemente char d [2] = "d"; Básicamente, necesita un 0 para finalizar su cadena estilo c que pasa para anexar – sbk

Respuesta

149
y += d; 

Yo utilizaría el operador += en lugar de funciones nombradas.

+1

¿por qué considera que + = es mejor que push_back? ¿Es solo menos tipeo o tienes otra razón? – Glen

+3

Es menos tipeo. En 'gcc',' basic_string :: operator + = 'es solo una llamada en' push_back'. – eduffy

+2

Es más natural IMO para cadenas. push_back es la función contenedor, y una cadena es una especializada en STL :) – AraK

43

uso push_back():

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

Prueba el operador + = link text, método link text, o push_back() método link text

Los enlaces en este post también contienen ejemplos de cómo utilizar los respectivos APIs append().

7

Además de los otros mencionados, uno de los constructores de cadenas toma un carácter y el número de repeticiones para ese carácter. Para que pueda usar eso para agregar un solo carácter.

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

Si está utilizando push_back no hay llamadas para el constructor de cadenas. De lo contrario, creará un objeto de cadena a través del casting, y luego agregará el carácter de esta cadena a la otra cuerda. Demasiado para un personaje pequeño;)

+1

operator + = (char c); está sobrecargado para cadenas. De hecho, el constructor de cadenas no acepta un carácter, vea la respuesta de Brian;) – AraK

16

Para añadir un char a un std :: string var utilizando el método de agregación, es necesario utilizar esta sobrecarga:

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

Editar: Tu eres no entendí el parámetro size_type, que se muestra en la ayuda contextual. Este es el número de caracteres para agregar. Así que la llamada correcta es

s.append(1, d); 
no

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

O la forma más simple:

s += d; 
+0

Creo que usar sizeof no es semánticamente correcto aquí (aunque funcione como sizeof (char) es siempre uno). El método de agregar es naturalmente más útil si quieres agregar más copias del mismo personaje !!!!!!!!!! – UncleBens

+1

¿Por qué estás usando 'sizeof (char)' en vez de '1'? Desea agregar exactamente una repetición de 'd', así que simplemente diga eso. El uso de 'sizeof' aquí es engañoso, ya que sugiere que uno tiene que decir' append' el tamaño de byte del tipo de datos utilizado (que no es el caso). –

+0

Como dijo Unclebens, el método de agregar es realmente más útil cuando se agrega el mismo carácter muchas veces. –

1

el problema con:

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

es que usted tiene que tener la 'd' como opp para usar un nombre de char, como char d = 'd'; ¿O estoy equivocado?

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

Aviso He escrito 10u y no 10 para el número de veces que me gustaría añadir el carácter; reemplaza 10 con cualquier número.

+3

Eso ya se publicó hace cuatro años. – 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 
} 

Nótese que en todos estos ejemplos se podría haber utilizado un carácter literal directamente: y += 'd';.

Su segundo ejemplo casi habría funcionado, por motivos no relacionados. char d[1] = { 'd'}; no funcionó, pero char d[2] = { 'd'}; (tenga en cuenta que la matriz es de tamaño dos) se habría trabajado aproximadamente igual a const char* d = "d";, y se podría anexar una cadena literal : y.append(d);.

1

intente utilizar el puntero d como y.append (* d)

+0

Eso es peligroso ya que un solo 'char' no es una cadena y no tiene un terminador nulo. Hacer esto provoca un comportamiento indefinido. –

4

pongo a prueba las diversas proposiciones mediante su ejecución en un bucle grande. Utilicé microsoft visual studio 2015 como compilador y mi procesador es 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; 

acuerdo con este ensayo, los resultados son los siguientes:

 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' 

Conclusión

+= parece más comprensible, pero si usted importa acerca de la velocidad, el uso anexan

+0

Para que esta respuesta sea significativa, al menos debe decir qué compilador está utilizando, porque tales cosas pueden variar MUCHO. También puede ser útil contar sobre su procesador para obtener una estimación aproximada del impacto real que podría tener. – akaltar

+0

Utilicé Visual Studio 2015. Buscaré gcc para hacer otras pruebas. Mi procesador es i7, 8 corazones, 2.20 Ghz ... Pero cualquiera que sea mi procesador, no tendrá ningún impacto en la implementación de std :: string. .excepto si algunos de estos métodos son multiproceso y algunos otros no. –

+0

A veces tiene un impacto, especialmente si muestra tiempos en milisegundos. En su lugar, puede mostrar en porcentaje en relación con el método más rápido (por lo que la velocidad real del procesador es irrelevante). También mueva los datos del comentario a su respuesta; esto es solo una etiqueta general de StackExchange. De lo contrario, buena respuesta. – akaltar

Cuestiones relacionadas