Strcat concat un char en una cadena?

Al usar GDB, encuentro un error de segmentación cuando bash esta operación:

strcat(string,&currentChar); 

Dado que la cadena se inicializa como

 char * string = ""; 

y currentChar es

 char currentChar = 'B'; 

¿Por qué esto resulta en una falla de segmentación?

Si no se puede usar strcat para esto, ¿de qué otra manera puedo poner un char en una cadena?

Como &currentChar no es una cadena, no termina con el carácter \0 . Debe definir B como char *currentChar = 'B'; . También de acuerdo con http://www.cplusplus.com/reference/clibrary/cstring/strcat, la string debe tener suficiente espacio para contener la cadena del resultado (2 bytes en este caso), pero solo es 1 byte.

O si quieres usar char entonces puedes hacer algo como (dependiendo de tu código):

 char string[256]; ... char currentChar = 'B'; size_t cur_len = strlen(string); if(cur_len < 254) { string[cur_len] = currentChar; string[cur_len+1] = '\0'; } else printf("Not enough space"); 

Como respondieron otros, & currentChar es un puntero a char o char * , pero una cadena en C es char [] o const char * .

Una forma de usar strcat para concatenar un char con una cadena es crear una cadena mínima y usarla para transformar una char en una cadena.

Ejemplo:

Hacer una cadena simple, con solo 1 carácter y el sufijo ‘\ 0’ ;

 char cToStr[2]; cToStr[1] = '\0'; 

Aplicando a tu pregunta:

 char * string = ""; char currentChar = 'B'; 

cToStr asumirá la cadena “B”:

 cToStr[0] = currentChar; 

Y Strcat funcionará!

 strcat ( string, cToStr ); 

strcat () toma dos cadenas terminadas en ‘\ 0’. Cuando pase la dirección de un carácter, la rutina mirará la memoria que sigue al carácter, buscando el terminador.

Ya que no sabe a qué se refiere esa memoria, debe esperar problemas cuando su código acceda a ella.

Además de eso, su argumento de cadena no tiene espacio para añadirle caracteres. ¿Dónde está escrita esa memoria? Intentará escribir más allá del final de la memoria asociada con esta cadena.

Creo que el método más simple (no eficiente) sería sprintf

sprintf(str, "%s%c", str, chr);

Ambas cadenas deben estar terminadas en nulo. Un solo carácter no termina en nulo, por lo que no está definido cuando strcat dejará de concatenar los caracteres hasta el final. Además, la cadena debe contener al menos suficiente espacio tanto para la cadena original como para la cadena resultante.

Esto funciona:

 char string[10] = ""; char* currentChar = "B"; strcat(string, currentChar); 

El primer argumento de strcat debe tener suficiente espacio para contener el rest de la cadena. “” es una cadena constante y, como tal, GCC no asigna espacio.

Haz que sea una matriz con suficiente espacio:

 char buf[1024]; strcat(buf, ""); strcat(buf, "B");