codice:
typedef char tipo_stringa[255];

Anche questo non ha senso: stai dicendo che un array di tipo_stringa equivale a un char.
A mio parere, in questo esercizio non è necessario definire nuovi tipi di dato, ma se proprio lo vuoi fare allora puoi pensare che una stringa non è altro che un array di char. Quindi

codice:
typedef char* String

Questo è un MWE (Minamal Working Example):

codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef char* String;


int main()
{
    /* allocazione della stringa */
    String m_string = (String) malloc(200 * sizeof(char));


    printf("Inserire una stringa: ");
    scanf("%s", m_string);
    printf("Hai inserito %s\n", m_string);


    /* allocazione di un'altra stringa */
    String altra_string = (String) malloc(200 * sizeof(char));


    /* copio nella seconda stringa il contenuto della prima */
    strcpy(altra_string, m_string);


    printf("Ripeto: %s\n", altra_string);


    return 0;
}

P.S. In questo modo leggi una sola parola. Se invece vuoi leggere una frase intera (con gli spazi) allora puoi utilizzare la funzione fgets.