2011-01-18 34 views
33

Tengo char, un personaje antiguo y llano, que me gustaría convertir en std::string. std::string(char) no existe, por supuesto. Podría crear una matriz char y copiarla, podría ir a través de secuencias de cadenas o muchas otras pequeñas rutas indirectas. Actualmente, prefiero boost::lexical_cast, pero incluso eso parece demasiado detallado para esta simple tarea. Entonces, ¿cuál es la forma preferida?Conversión preferida de char (no char *) a std :: cadena

Respuesta

57

std::string tiene un constructor que toma un número y un carácter. El personaje se repetirá la cantidad de veces que quiera. Por lo tanto, debe utilizar:

std::string str(1, ch); 
+13

Esta es la respuesta correcta. Pero lo que no me gusta de este constructor es que no lo uso lo suficiente como para recordar el orden de los parámetros. Y si los cambias, aún compila. –

+2

@Fred Larson Esto es por supuesto lo que me acaba de pasar ya que estaba intentando esta solución. –

+0

Sin embargo, solo funciona para el caso de un personaje. ¿Qué pasa si tienes 'char x [] = {'a', 'b', 'c'}'?) –

4

¿solo usa la sobrecarga que lleva un char?

decir string(1, 'A')

3

Puede seguir utilizando el constructor de cadena teniendo dos iteradores:

char c = 'x'; 
std::string(&c, &c + 1); 

Actualización:

Buena pregunta James y GMan. Sólo buscado libremente descargable "La nueva C estándar" por Derek M. Jones por "puntero del pasado" y mi primer éxito fue:

Si los puntos expresión P a un elemento de un objeto de matriz y la expresión Q apunta al último elemento del mismo objeto de matriz, la expresión puntero Q + 1 compara mayor que P ... aunque Q + 1 hace no apunta a un elemento del objeto de matriz ...

En arquitecturas segmentadas incrementando un puntero más allá del final de un segmento hace que la dirección para envolver arquitectura segmentada en torno a la comienzo de ese segmento (por lo general dirección cero). Si una matriz se asignado dentro de un segmento tal, ya sea la aplicación debe asegurar que hay espacio después de la matriz para que haya un uno más allá de la dirección de fin , o se utiliza alguna otra técnica aplicación para manejar este caso (por ejemplo, si el segmento utiliza es parte de la representación de un puntero, un especial pasado el segmento final podría ser asignado valor) ...

el modelo operador relacional C permite punteros a objetos a tratar en de la misma manera que los índices en la matriz objetos. Comparaciones relacionales entre índices en dos objetos de matriz diferentes (que no son ambos subobjetos de un objeto más grande) rara vez tienen algún significado y el estándar no define dicho soporte para punteros. Algunas aplicaciones necesitan hacer uso de información sobre las ubicaciones relativas de diferentes objetos en almacenamiento. Sin embargo, este uso no era considerado de suficiente utilidad general para el Comité para especificar un modelo definir el comportamiento ...

La mayoría de las implementaciones no realizan comprobaciones antes de cualquier operación en los valores con tipo de puntero. La mayoría de los procesadores usan las mismas instrucciones para realizando comparaciones relacionales que involucran tipos de punteros ya que usan para tipos aritméticos. Para procesadores que usan una arquitectura de memoria segmentada , un valor de puntero es a menudo representado mediante dos componentes, un número de segmento y un desplazamiento dentro de ese segmento. Una consecuencia de esta representación es que hay muchas beneficios en la asignación de almacenamiento para objetos de tal manera que se ajusta dentro de un solo segmento (es decir, el almacenamiento de un objeto no abarcan un límite de segmento ). Una ventaja es una optimización que implica el código de máquina generado para algunos de los operadores relacionales , que solo necesita para verificar el componente de compensación de segmento. Esto puede provocar que p> = q sea falso, pero p> q es verdadero, cuando pyq apuntan a objetos diferentes.

+3

¿Es esto estrictamente válido? ¿Puedes tratar un objeto escalar como una matriz de un solo elemento y luego usar el puntero de un solo extremo? –

+2

Absolutamente. Una matriz de un elemento y un escalar tienen el mismo diseño y alineación. De hecho, sizeof (elemento) se define como un múltiplo de la alineación del elemento, por lo que no hay relleno entre los elementos de una matriz. –

+2

@Maxim: ¿Cómo sabemos eso? Un puntero pasado el final de una matriz es válido (aunque no se puede desreferenciar), pero no creo que sea un puntero pasado un elemento, como dice @James. – GManNickG

0

Esto funciona en C++ gcc 4.9.2 (http://ideone.com/f3qhTe)

#include <iostream> 
using namespace std; 

int main() { 
    // your code goes here 
    std::string test; 

    test = (char) 76; 
    test += (char) 77; 
    test += (char) 78; 
    test += (char) 79; 

    std::cout << "test contains: " << test << std::endl; 
    return 0; 
}