En realidad no es tan dificil; el problema está en que no tienes claras algunas cosas.
P.ej. cada letra se simboliza por un char, y cada grupo de letras se simboliza como grupo de chars; traducido signifnica que si quieres guardar una palabra (en este caso el nombre de una persona) tienes que proveer un conjunto de chars:
En este caso la variable 'palabra' es capaz de albergar 255 letras (incluidos espacios) mas el \0 final. En tu codigo estas intentando guardar el nombre en un array de 1 caracter, y ya puedes imaginar que no funcionará de la forma esperada.
Otra cosa, las funciones hacen determinadas operaciones que puedes encontrar definidas en cualquier manual de C, algunas operan de una forma concreta, otras de otra. En el caso de escanear datos de teclado usando scanf siempre queda como residuo de la stdin el return que picaste para aceptar la entrada. Te lo comento muy por encima: el stdin funciona como una pila fifo (el primero que entra es el primero que sale). Esta funcion scanf lee (y quita) caracteres del stdin hasta encontrar un espacio o un salto de linea (el enter es un salto de linea). Por eso cuando haces scanf de un texto siempre queda un \n como primer caracter del stdin para la siguiente operacion o lo que hubiere a continuacion del primer espacio del text (en tu caso entras un nombre con espacios, lee hasta el primer espacio dejando el apellido y el salto de linea, despues escaneas un entero que no enuentra el formato indicado y lo descarta). Puedes usar otra funcion de escaneado de texto para leer espacios y purgar los saltos de linea, por ejemplo gets.
Junto con lo anterior tienes los argumentos y los modificadores (o formateadores o como se llamen) que envias a las funciones scanf y printf. El modificador %s implica que vas a proporcionar un array de caracteres, pero en ambos casos tu les estas proporcionando un solo caracter, y como el compilador te daba fallos pusiste un puntero al caracter para que dejara de quejarse:
Código C:
Ver originalchar n;//un caracter
scanf("%s", n
);//aqui te da error y lo solucionas con un & scanf("%s", &n
);//aqui te compila bien pero no funciona como esperas printf("%s", n
);//aquí tienes un violacion de segmento
Y por ultimo pero no menos importante es el indentado del codigo; es una buena practica agrupar e indentar tus lineas de codigo por dos motivos: facilidad de lectura para ti, y facilidad de lectura para los demas. En este caso has visto como tu codigo mal indentado ha espantado a qualquier forero que pudiera haberte ayudado con esto. Tambien influyen los nombres de las variables, si quieres una variable para el nombre es mejor llamarla 'nombre' o 'str_nombre' que 'n', de esta forma un simple vistazo a la variable y ya sabes que contiene (o que se espera que contenga); por lo mismo los nombres de las funciones tienes que ser lo maximo de significativos posible (en tu codigo no tienes ninguna de propia, pero acuerdate de esto que te comento para cuando llegue el caso).
Personalmente creo que deberias repasar tus apuntes de C, concretamente estas partes de arrays de caracteres (y topos de datos en general, siempre viene bien), y tambien deberias echar otro vistazo a las referencias de las funciones que estas usando, para ver como funcionan y que esperan que les envies. En internet encontraras todo esto y mas que te será de utilidad.
Vamos, no te tomes a mal mis criticas y echale ganas de aprender a programar, que este ejercicio no tiene que ser ningun obstaculo para continuar con tus ejercicios. Ni tampoco te pongo la solucion, que se supone que debes encontrarla sin problemas.
Saludos
vosk