Ir ao conteúdo
  • Cadastre-se

C Rotina em C que retorna 0 para sim e 1 para não, so sai do laço ao ler "SAIR"


lucas.suanderhus

Posts recomendados

@lucas.suanderhus      linux nunca mexi nele , então não sei como funciona , mas experimente remover esse system pause . por que se você estiver usando o compilador dev c++ , o terminal fecha rapidamente , por  isso o pause para ver o que está na tela antes de fechar .

Link para o comentário
Compartilhar em outros sites

Olá!
 
Na sua rotina() você declarou S[] como char. Então S é um ponteiro para char. E assim S[0] que também pode ser escrito como S é um char. Em main() você declara char str[4] e chama rotina(str) passando str como parâmetro para sua rotina(). Então em rotina() você pode usar acessar S[0] ou S, S[1] e S[2] e S[3].

 

Por outro lado "SIM" é uma string, char*. Mesmo caso de "SAIR" e de "NAO". Então você não pode escrever

if(S=="SIM")
ou
if(S=="NAO")

porque do lado esquerdo tem um char e do lado direito tem um ponteiro para char.

Você pode escrever

if(S == 'S')

porque S é char e 'S' é char
ou 

if(strcmp(S,"SIM) == 0)

porque essa rotina aceita dois parâmetros do tipo char*, ponteiros para char. E "SIM" é do tipo char*, uma string. E S é do tipo char* declarado como S[]. strcmp() retorna 0 se as duas strings são iguais, algum valor < 0 se a primeira for menor e algum valor >0 se a segunda string for maior que a primeira

 

Seu enunciado diz claramente para aceitar "SIM" ou "NAO" então eu não recomendo ir além do que está escrito e se preocupar com maiúsculas e minúsculas... Mas não sou seu professor :D


Assim sendo você tem duas opções: pode usar o que alguns chamam de árvore de decisão e ir vendo se o cara digitou S depois I ou A e tal... Testando uma letra por vez. Ou usar strcmp() e testar as strings.


Seu enunciado diz claramente que não é pra retornar exceto com "SIM" ou "NAO" e que não pode voltar a ler quando ler um "SAIR", de modo que deve ser o caso de encerrar o programa sem retornar chamando exit().

 

Assim essas duas serviriam

int rotina()
{
    const char* SIM = "SIM";
    const char* NAO = "NAO";
    const char* SAIR = "SAIR";
    char            entrada[40];

    do
    {
        printf("rotina(): Entre string: ");
        scanf("%s", entrada);
        if (strcmp(entrada, "SIM") == 0) return 1;
        if (strcmp(entrada, NAO) == 0) return 0;
        if (strcmp(entrada, SAIR) != 0) continue;
        printf("Leu \"SAIR\". Encerrando\n");
        exit(0);
    } while (1);

}    // end rotina()

usando strcmp() ou

int rotina_b()
{
    char    entrada[40];
    do
    {
        printf("rotina(): Entre string: ");
        scanf("%s", entrada);
        if (entrada[0] == 'S')
        {
            if (    (entrada[1] == 'A') &&
                    (entrada[2] == 'I') &&
                    (entrada[3] == 'R')
            )
            {
                printf("Leu \"SAIR\". Encerrando\n");
                exit(0);
            }
            else
            {
                if ((entrada[1] == 'I') &&
                    (entrada[2] == 'M')
                )
                {
                    return 1;
                }
                else
                {
                    continue;
                }
            }    // end if    
        }
        else
        {    // nem SIM nem SAIR: pode SER NAO
            if ((entrada[0] == 'N') &&
                (entrada[1] == 'A') &&
                (entrada[2] == 'O')
                )
                return 0;
            else
                continue;
        }    // end if 'S'
    } while (1);

}    // end rotina_b()

Usando os char apenas

Essa simples função main()

int    main(int argc, char** argv)
{
    int v;
    while (1)
    {
        v = rotina_b();
        printf("main(): rotina() retornou %d\n", v);
    }    // end while()
    return 0;
}    // end main()

mostraria isso

rotina(): Entre string: 12
rotina(): Entre string: 12
rotina(): Entre string: 12
rotina(): Entre string: SIM
main(): rotina() retornou 1
rotina(): Entre string: NAO
main(): rotina() retornou 0
rotina(): Entre string: SAIR
Leu "SAIR". Encerrando

Como esperado. Note que em C 1 é sempre verdade então while(1) é comum de se escrever quando se sabe que um loop vai terminar por alguma maneira dentro dele, como por uma chamada a exit().

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!