Q:

Qual a forma correta de se declarar um string em C?

Existe varias formas de se declarar uma variável do tipo string em C como:
char *str;
char str[];
char str[100];
char str[1][100];

O que eu gostaria de saber é, existe uma forma correta para declarar uma variável do tipo string ou mais recomendada para determinados casos?

A:

Nenhuma delas está declarando strings mesmo, estão declarando variáveis que podem suportar strings.
A última me parece estranha, mas funciona, se usado certo, de forma geral não é usado a não ser que tenha um motivo específico. As outras estão todas corretas.
Esta declara que a variável str* será um ponteiro para caracteres. Onde estão estes caracteres é problema de outra parte do código dizer, o que precisa é que depois coloque o endereço da string nesta variável.
char *str;

Já a seguinte não é permitida porque não tem como determinar o tamanho do array.
char str[];

Está já muda um pouco porque ela já reserva o espaço para 100 caracteres (99 úteis) e a string ficará junto da variável alocado já no stack. O conteúdo será colocado em seguida.
char str[100];

Na verdade o mais comum é fazer assim, no stack ou na área estática:
#include <stdio.h>

int main(void) {
    char str[] = "teste";
    char *strx = "teste";
    printf("%s", str);
    printf("%s", strx);
}

Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.
Veja mais em Ponteiro de char ou array de char?.
Entenda a diferença entre array e ponteiro.
E ainda leia:

Diferença entre array de char e ponteiro de char
char[] ou *char malloc?
O que são e onde estão a "stack" e "heap"?

