Q:

como retornar una cadena en c

Estoy haciendo una funcion para capturar una cadena de caracteres alfanumérica y numérica he visto varias maneras para poder tomar por return la cadena pero no lo consigo 
Dejo mi código si alguien pudiera decirme que estoy haciendo mal.
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

void gotoxy(int x,int y){
      HANDLE hcon;
      hcon = GetStdHandle(STD_OUTPUT_HANDLE);
      COORD dwPos;
      dwPos.X = x;
      dwPos.Y= y;
      SetConsoleCursorPosition(hcon,dwPos);
}
char*  CaptureString(int Lin_Ini ,int Col_Ini , int Min_Len , int Max_Len , int Format ) {

    int i=0;
    int Len_Captura;
    char captura;
    int prueba;
    char cadena[10];

    if (Format == 1){    
        while(TRUE){
            int i=0;    
            gotoxy(Lin_Ini ,Col_Ini);
            captura = getch();
            sprintf(&cadena[strlen(cadena)] , "%c" , captura);

            if (captura >=48 && captura <=57 || captura == 8 || captura == 13){        
                if (captura == 8){    
                    memset(&cadena[strlen(cadena)], 0x00 , 1);    
                }    
                printf("%s" ,cadena);

                if (captura == 13){    
                    return cadena;    
                }
            }
        }
    }    
    else if (Format == 2 ){    
        while(TRUE){
            int i=0;    
            gotoxy(Lin_Ini ,Col_Ini);
            captura = getch();

            if (captura >=97 && captura <=122 || captura >=48 && captura <=57 || captura == 8){

                sprintf(&cadena[strlen(cadena)] , "%c" , captura);
                printf("%s" ,cadena);

                if (captura == 8){    
                    memset(&cadena[strlen(cadena)], 0x00 , 1);    
                }
            }
        }
    }
}

int main(){
    char Captura_fin;
    printf("Bienvenido al programa 3 captura de una cadena con formato \n");    
    Captura_fin = CaptureString(12,15,4,12,1);    
    printf("la cadena escrita es ");
    puts (&Captura_fin);    
    return 0;
}

A:

char*  CaptureString(int Lin_Ini ,int Col_Ini , int Min_Len , int Max_Len , int Format )
{
  char cadena[10];

  // ...

  return cadena;
}

La variable cadena, así como está declarada, está haciendo uso de la pila del programa. Al abandonar la función esa reserva se pierde y la variable, simplemente, deja de existir.
Para que la cadena sobreviva a la función tiene que estar almacenada en el heap, es decir, tienes que usar memoria dinámica:
char*  CaptureString(int Lin_Ini ,int Col_Ini , int Min_Len , int Max_Len , int Format )
{
  char* cadena = malloc(10);

  // ...

  return cadena;
}

Eso sí, en ese caso no debes olvidar llamar a free cuando la variable retornada ya no sea necesaria.
Para evitar este engorro las funciones del estándar suelen recibir las cadenas como referencia. Esto permite a quien consume la función decidir dónde quiere ubicar la variable:
void CaptureString(char* cadena, /* ... */)
{
  // ...
}

Por cierto, fíjate que no todas las rutas de la función CaptureString hacen return. eso te puede traer problemas y es una práctica a evitar.

