Non puoi in maniera dinamica se non allocando uno spazio grande a sufficienza. Una cosa del tipo
char * str = new char[1000];
cin >> str;
//uso str
....
delete [] str;
Ecco perche bisogna creare una classe o meglio non re-inventare la ruota e usare la classe std::string così
std::string temp;
cin >> temp;
char *str = new char[temp.length() + 1];
strcpy(str,temp.c_str());
//uso str
......
//poi elimino lo spazio allocato
delete [] str;