RE:como concatenar a un string un char?
La asignación cadena="" creo que es aceptable para el compilador pero tené cuidado, porque no reserva más memoria para esta variable que la cadena "", es decir no tiene lugar para agregarle nada. Reservá espacio para la cadena en forma dinámica o fija, no sea cuestión que cuando intentes concatenarle algo se corrompa la memoria.
Yendo al tema de tu pregunta, no es válido tomar la dirección (con &) de un char para usarlo en funciones como strcpy o strcat, porque estas funciones asumen que en esa dirección hay un string, y el final de un string se determina con la presencia de un carácter nulo ('\0'). En tu caso tenés r pero no sabés qué hay más allá de r, puede estar tomando un string con cualquier cosa e intentando almacenarlo en cadena, que para colmo no tiene espacio reservado para nada.
Entonces, asumamos que cadena tiene espacio suficiente, por ejemplo reservado en forma fija:
char cadena[80];
Si querés asignarle a la cadena el char r y nada más, podés hacer así:
cadena[0]=r;
cadena[1]='\0';
Si querés concatenar r a lo que ya hay en cadena, así:
cadena[strlen(cadena)+1]='\0';
cadena[strlen(cadena)]=r;