C++ Agregar carácter a std::string desde int

Tengo un carácter del teclado, por entero:

int c = getch();

y quiero agregarlo a una cadena solo si no es un return:

void somefunction()
{
    std::string str = "you pressed: ";
    int c;
    while ( 1 )
    {
        c = getch();
        if ( c == 10 ) break;
        char* ch;
        sprintf(ch,"%c",c);
        str += std::string(ch);
    }
}

sin embargo, esto crea un error de segmentación cuando el alcance de somefunction es izquierda. Estoy adivinando que cuando el dtor para str se llama puntero a ch ya no está disponible.

¿Cómo puedo remediar esto?

preguntado el 12 de junio de 12 a las 12:06

Su problema aquí es que el puntero ch no está inicializado y podría apuntar a cualquier parte. -

El error de segmentación ocurre porque en realidad no asigna memoria para la matriz de caracteres sprintf imprime a. -

Su otro problema es que está mezclando la manipulación de cadenas de estilo C con el estilo C ++ de la misma. Esto se puede hacer, por supuesto, pero no es necesario ni trivial para hacerlo bien (como lo indica sstn). -

El error de segmento se debe a que sprintf está escribiendo en datos aleatorios. Cambio char *ch; a char ch[2]; - pero realmente, use cualquiera de los métodos std::string apropiados en las respuestas... -

lo raro es que cuando comento el str += ... línea, no se produce ninguna falla de segmento, lo que me lleva a creer que el ch la inicialización se realiza correctamente. -

2 Respuestas

Esto es mucho más fácil de lo que piensas:

str.push_back(c);

Respondido el 12 de junio de 12 a las 12:06

@Nawaz ¿Qué te hace decir eso? - james mclaughlin

@JamesMcLaughlin: Ohh... Pensé erróneamente que era + más bien que +=. - Nawaz

stringstream podría ser otra clase de interés aquí. - Peatón imprudente

Está obteniendo una falla de segmentación, porque está tratando de sprintf cadena en memoria desconocida (aún no asignada):

char* ch;
sprintf(ch,"%c",c);

la posible solución de su código sería reemplazar char* ch; con char ch[2]; que causaría ch para convertirse en una matriz asignada estáticamente con una duración de almacenamiento automática.

Pero tenga en cuenta que dado que está programando en C ++, sería más inteligente usar flujos y métodos de std::string en lugar de estilo C (char*) cadenas y funciones de estilo C como sprintf.

Respondido el 12 de junio de 12 a las 12:06

+1. En realidad, es una respuesta completa, ya que explica la causa de la falla de segmento. - Nawaz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.