Dúvida em C com string - validação da String

Tenho um trabalho para fazer na facul em C, o trabalho é bem grande, estou com dificuldade nesta parte que é a primeira parte do programa.

Escreva um algoritmo que seja capaz de processar uma cadeia de DNA. Cadeias de
DNA são strings que são formadas exclusivamente pelos caracteres ‘A’, ‘C’, ‘G’ e ‘T’ ?
nenhum outro caracter é permitido. O algoritmo deve se certificar que o usuário entrou
com uma string que só contenha os caracteres indicados.

To com dificuldade de validar essa cadeia de DNA. Vejam se podem me ajudar, por favor.

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string.h>

int main(){
char dna[15], ch,*ch2;
int i,opcao,tam;
printf("Digite uma cadeia de DNA: ");
setbuf(stdin, 0);
fgets(dna,15,stdin);
tam=strlen(dna);

for(i=0;i<dna[i]!=0;i++){
     if(dna[i] == 'A' || dna[i] == 'C' || dna[i] == 'G' || dna[i] == 'T'){
               printf("\nSequencia de dna valida! Prossiga ");
     }else{
               printf("\nSequencia de dna invalida!");
     }
}
getch();
return 0;

}

Fico no aguardo.

e qual erro que está dando?

Pergunto isso pq ja evita de ficar ‘compilando’ mentalmente teu programa, e acho dificil alguem pegar seu codigo, baixar um compilador C para testar e ver qual o erro que está dando…

O erro que está dando é que qualquer sequencia de dna que eu coloco aparece a mensagem no final de "Sequencia invalida!"
E o looping não está certo, porque aparece essa mensagem : “Sequencia de dna valida! Prossiga” o número de letras que eu digito, queria que essa mensagem só aparecesse uma vez.

Por exemplo, coloquei essa sequencia: “GATACA”

A resposta do programa é:
“Sequencia de dna valida! Prossiga”
“Sequencia de dna valida! Prossiga”
“Sequencia de dna valida! Prossiga”
“Sequencia de dna valida! Prossiga”
“Sequencia de dna valida! Prossiga”
“Sequencia de dna valida! Prossiga”
“Sequencia de dna invalida!”

Veja se consegue me ajudar.

Uma sequencia é inválida quando pelo menos uma letra é diferente de A, C, G ou T.

Ou seja, crie uma variável booleana (ou seja, pode assumir os valores 1 ou 0) que indique se achou pelo menos uma letra que seja diferente de A, C, G ou T.

Suponha, a princípio, que essa variável seja 0 (ou seja, não achou nenhuma letra que seja diferente de A, C, G ou T).

A seguir, execute um loop for que teste cada uma das letras da string para ver se alguma delas é diferente de A, C, G ou T.
Se for, então você pode atribuir o valor 1 (indicando que há uma letra diferente de A, C, G ou T).

Depois de sair do loop, você checa se a variável é zero (ou seja, é válida porque nenhuma das letras é diferente de A, C, G ou T) ou um (indica que a sequencia é inválida porque achou pelo menos uma letra que não é A, C, G ou T).

Essa parte eu consegui resolver, olhe como ficou:

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string.h>
#include<ctype.h>// para usar função toupper

int main(){
char dna[15], ch,*ch2,ch1;
int i,opcao,tam,contDif,contBase;
int valida=0;//variável para validar a cadeia de DNA
printf(“Digite uma cadeia de DNA: “);
setbuf(stdin, 0);
fgets(dna,15,stdin);
tam=strlen(dna);
//adicionei a função toupper, para o caso de o usuário digitar em minusculo.
for(i=0;i<tam-1;i++){
if(toupper(dna[i]) != ‘A’ && toupper(dna[i]) != ‘C’ && toupper(dna[i]) != ‘G’ && toupper(dna[i]) != ‘T’){
valida=1;
}
}
if (valida==0)
printf(”\nSequencia de dna valida! Prossiga. “);
else {
printf(”\nSequencia de dna invalida!”);
}

Mas agora to com dúvida em outra parte, não sei porque não está pegando o caracter no case 1 e 2
Vejam se podem me ajudar

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string.h>
#include<ctype.h>// para usar função toupper

int main(){
char dna[15], ch,*ch2,ch1;
int i,opcao,tam,contDif,contBase;
int valida=0;//variável para validar a cadeia de DNA
printf(“Digite uma cadeia de DNA: “);
setbuf(stdin, 0);
fgets(dna,15,stdin);
tam=strlen(dna);
//adicionei a função toupper, para o caso de o usuário digitar em minusculo.
for(i=0;i<tam-1;i++){
if(toupper(dna[i]) != ‘A’ && toupper(dna[i]) != ‘C’ && toupper(dna[i]) != ‘G’ && toupper(dna[i]) != ‘T’){
valida=1;
}
}
if (valida==0)
printf(”\nSequencia de dna valida! Prossiga. “);
else {
printf(”\nSequencia de dna invalida!”);
}

printf("\n\n1 - Digite um caracter referente a base nitrogenada: ");
printf("\n2 - Contar o numero de ocorrencias de uma determinada base nitrogenada na cadeia: ");
printf("\n3 - Apresentar a cadeia complementar a cadeia inserida: ");
printf("\n4 - Comparar a similaridade e acoplamento entre duas cadeias: ");
printf("\n\n\tEntre com a opcao desejada: ");
scanf("%i",&opcao);

//strchr(string, caracter) Este função retorna um ponteiro para a primeira ocorrência de "caracter".
switch (opcao){
       case 1: printf("\n\nDigite um caracter referente a base nitrogenada: ");
               ch = getchar();                   
               ch2 = strchr(dna, ch);
              
               if (*ch2){
                     printf("\n");
                     printf("\nA primeira ocorrencia de %c eh na posicao %d\n",ch,ch2 - dna);
               }else{
                     printf("\nCaractere nao encontrado.\n");
               }
               //2. Contar o número de bases nitrogenadas diferentes encontrada na cadeia.
               contDif=0;
               for(i=0;i<dna[i]!=0;i++){
                     if (dna[i]!=ch){
                           contDif=contDif+1;
                     }
               }
               printf("\n\nO numero de bases diferentes de %c eh: %i\n",ch,contDif-1);
       break;
       
       case 2: printf("\n\nDigite um caracter referente a base nitrogenada: ");
               ch1 = getchar();
               contBase=0;
               for(i=0;i<dna[i]!=0;i++){
                     if (dna[i]==ch1){
                           contBase=contBase+1;
                     }
               }
               printf("\nO numero de ocorrencias da base %c eh: %i\n",ch1,contBase);
       break;
       
       case 3: for(i=0;i<tam-1;i++){
                     if(toupper(dna[i]) =='A'){
                           printf("\nA -- T");
                     }
                     if(toupper(dna[i]) =='C'){
                           printf("\nC -- G");
                     }
                     if(toupper(dna[i]) =='T'){
                           printf("\nT -- A");
                     }
                     if(toupper(dna[i]) =='G'){
                           printf("\nG -- C");
                     }
               }
       break;
       
       default:
               printf("\nOpcao invalida!");
               
}

getch();
return 0;

}