C++ Agregar carácter a std::string desde int
Frecuentes
Visto 630 veces
0
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?
2 Respuestas
13
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
7
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
Su problema aquí es que el puntero ch no está inicializado y podría apuntar a cualquier parte. - sstn
El error de segmentación ocurre porque en realidad no asigna memoria para la matriz de caracteres
sprintf
imprime a. - jrokSu 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). - Sebastian Mach
El error de segmento se debe a que sprintf está escribiendo en datos aleatorios. Cambio
char *ch;
achar ch[2];
- pero realmente, use cualquiera de los métodos std::string apropiados en las respuestas... - Roddylo raro es que cuando comento el
str += ...
línea, no se produce ninguna falla de segmento, lo que me lleva a creer que elch
la inicialización se realiza correctamente. - romeovs