Jump to content
Sign in to follow this  
carlos870

switch com char

Recommended Posts

carlos870

Boas. Bom ano novo para todos.

Tenho este código:

    char a[500];

    do
    {
        gets(a);

        switch (a)
        {
            case 1:
            {
                printf("Olá\n");
                break;
            }
            case 2:
            {
                printf("Olá\n");
                break;
            }
        }
    }while ((a[0]!='3') || (strlen(a)!=1));

Mas dá erro no switch. Diz que não é um inteiro.

Já tentei as plicas nos números dos cases, já meti switch ((int) a), mas assim o programa abre mas não acontece nada quando carrego no 1 ou 2.

Podem ajudar?

Share this post


Link to post
Share on other sites
bubulindo

experimenta a[0] e vais ver que as coisas dão certo. ;)


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
carlos870

Agora há outro problema: se eu introduzir 123456 ele vai para o primeiro case, quando não devia ir para nenhum. Isto acontece porque a validação está depois do switch.

Share this post


Link to post
Share on other sites
Cynary

Além de teres de usar o a[0], tens de fazer outras coisas...

Estás a comparar o char '1' ao inteiro 1! Eles são diferentes (já deves ter ouvido na tabela ASCII - tem a ver com isso).

Outra coisa, a função gets nunca deve ser usada, pois lê tudo, o que te pode causar um overflow (por exemplo, se inserirem 1000 caracteres, o gets tenta inserir 1001 caracteres num array de tamanho 500, o que pode ou causar problemas ou crashar o programa). Em vez do gets, usa o fgets.

Não percebi o teu problema ... ao inserires 123456 ele devia ir para o primeiro case ;), visto o primeiro caracter inserido ser o '1'.

Se inserires algo diferente de 1 ou 2, ele não vai para nenhum case ...

Se calhar o que queres é, em vez de leres uma string, ler um inteiro.

Share this post


Link to post
Share on other sites
carlos870

Esqueçam o meu primeiro post.

Eu tenho este pedaço de código referente a um projecto final de programação:

    do
    {
        printf(" -------------------------------------------\n");
        printf(" |            Menu de utilizacao           |\n");
        printf(" -------------------------------------------\n");
        printf("\n");
        printf(" -------------------------------------------\n");
        printf(" |Seleccione a opcao que deseja escrevendo |\n");
        printf(" |o numero a qual esta associada e         |\n");
        printf(" |premindo enter.                          |\n");
        printf(" -------------------------------------------\n");
        printf(" |  1 - Administrador                      |\n");
        printf(" |  2 - Utilizador                         |\n");
        printf(" |  3 - Sair                               |\n");
        printf(" -------------------------------------------\n");
        scanf(" %d",&opt);
        system("cls");

        switch (opt)
        {
            case 1:
            {
	/////blablabla
                break;
            }
            case 2:
            {
	/////blablabla
                break;
            }
        }

    }while (opt!=3);

Quero fazer validação dos dados de entrada, mas actualmente só consigo fazer essa validação quando o utilizador apenas introduz números. Se introduzir caracteres, o programa bloqueia.

Através da explicação que aqui foi dada consegui fazer a validação de caracteres.

Mas ao introduzir "123" no programa que eu tenho, ele volta a repetir tudo (não entra em nenhum case nem sai da aplicação).

Ao introduzir "123" no programa alterado para validar caracteres, ele vai para o case 1.

Eu quero que ele repita tudo.

Share this post


Link to post
Share on other sites
Cynary

Esqueçam o meu primeiro post.

Eu tenho este pedaço de código referente a um projecto final de programação:

    do
    {
        printf(" -------------------------------------------\n");
        printf(" |            Menu de utilizacao           |\n");
        printf(" -------------------------------------------\n");
        printf("\n");
        printf(" -------------------------------------------\n");
        printf(" |Seleccione a opcao que deseja escrevendo |\n");
        printf(" |o numero a qual esta associada e         |\n");
        printf(" |premindo enter.                          |\n");
        printf(" -------------------------------------------\n");
        printf(" |  1 - Administrador                      |\n");
        printf(" |  2 - Utilizador                         |\n");
        printf(" |  3 - Sair                               |\n");
        printf(" -------------------------------------------\n");
        scanf(" %d",&opt);
        system("cls");

        switch (opt)
        {
            case 1:
            {
	/////blablabla
                break;
            }
            case 2:
            {
	/////blablabla
                break;
            }
        }

    }while (opt!=3);

Quero fazer validação dos dados de entrada, mas actualmente só consigo fazer essa validação quando o utilizador apenas introduz números. Se introduzir caracteres, o programa bloqueia.

Através da explicação que aqui foi dada consegui fazer a validação de caracteres.

Mas ao introduzir "123" no programa que eu tenho, ele volta a repetir tudo (não entra em nenhum case nem sai da aplicação).

Ao introduzir "123" no programa alterado para validar caracteres, ele vai para o case 1.

Eu quero que ele repita tudo.

Então o que tu precisas é de comparar com strings ...

Acho que não consegues fazer isso com switch, visto que, para comparar uma string com outra, precisas da função strcmp. O que tu precisas é de if/else.

Assim, lês a string do input, e comparas com "1", "2" e "3".

Estuda como funciona a função strcmp, e tenta perceber este conselho, que chegas lá.

Share this post


Link to post
Share on other sites
carlos870

Bom, estive aqui a inventar e cheguei a isto:

    char a[500];
    do
    {
        gets(a);

        if ((a[0]=='1') && (strlen(a)==1))
        {
            printf("aaaaa\n");
        }
        if ((a[0]=='2') && (strlen(a)==1))
        {
            printf("zzzzz\n");
        }

    }while ((a[0]!='3') || (strlen(a)!=1));

Aparentemente faz o pretendido.

Mas eu estou a declarar um char de 500 porque não sei o que o utilizador poderá introduzir. Não haverá maneira de não definir o tamanho do array? De maneira a que ele aceite qualquer coisa que se introduza, quer seja pequena ou grande.

Share this post


Link to post
Share on other sites
Cynary

O fgets só lê até um certo limite, por isso é o melhor.

O que sugeres é basicamente o comportamento de strings em C++.

O que podes fazer é criar a tua própria função de input, que lê caracter a caracter, e usa memória dinâmica.

Outra coisa que podes fazer é o seguinte:

Lês caracter a caracter, só comparas o primeiro caracter, e lês até encontrares um '\n'. Se leres só um caracter antes do '\n' então o utilizador inseriu uma opção, senão, ignoras.

Share this post


Link to post
Share on other sites
carlos870

Tentei isto:

fgets(a,500,stdin);

Mas assim ele está sempre a repetir e não aceita nenhuma opção.

Share this post


Link to post
Share on other sites
Cynary

Tentei isto:

fgets(a,500,stdin);

Mas assim ele está sempre a repetir e não aceita nenhuma opção.

Isso acontece por causa do comportamento do fgets (tens de treinar técnicas de debug :/ tens de ser capaz de encontrar onde está o erro - isto descobria-se em poucos minutos com um ou dois printfs ...): o fgets lê caracteres até esgotar o limite de 500 caracteres ou encontrar uma nova linha. Quando encontra uma nova linha, além dos caracteres inseridos, ele também insere essa nova linha.

Ou seja, quando escreves:

1

O fgets escreve no array "1\n".

Ou seja, o comprimento dessa string será de dois (logo, tens de ajustar o teste de comparação do strlen).

Share this post


Link to post
Share on other sites
rolando2424

Tentei isto:

fgets(a,500,stdin);

Mas assim ele está sempre a repetir e não aceita nenhuma opção.

O problema é que o fgets também coloca no array o char '\n' que é o char gerado quando primes a tecla Enter.

Documentação do fgets:

      char *fgets(char *s, int size, FILE *stream);

      fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by

      s.  Reading  stops  after  an EOF or a newline.  If a newline is read, it is stored into the buffer.  A '\0' is

      stored after the last character in the buffer.

Se quiseres trocar o '\n' por um '\0', podes usar o seguinte código, depois de usares o fgets:

char *posicao_newline = strchr(a, '\n');
*posicao_newline = '\0';

Já agora, a documentação do strchr:

      char *strchr(const char *s, int c);

      The strchr() function returns a pointer to the first occurrence of the character c in the string s.

EDIT: Podes ver a documentação das funções que estão definidas no header string.h neste link.

A definição do strchr que dei não está igual a essa, porque eu fui buscar a minha definição a outro sítio ;)


Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos. Prontos, a minha pessoa está oficialmente protegida legalmente :D

Share this post


Link to post
Share on other sites
carlos870

Então pode ficar assim:

    char a[5];
    do
    {
        fgets(a,5,stdin);

        if ((a[0]=='1') && (strlen(a)==2))
        {
            printf("aaaaa\n");
        }
        if ((a[0]=='2') && (strlen(a)==2))
        {
            printf("zzzzz\n");
        }

    }while ((a[0]!='3') || (strlen(a)!=2));

Share this post


Link to post
Share on other sites
Cynary

Então pode ficar assim:

    char a[5];
    do
    {
        fgets(a,5,stdin);

        if ((a[0]=='1') && (strlen(a)==2))
        {
            printf("aaaaa\n");
        }
        if ((a[0]=='2') && (strlen(a)==2))
        {
            printf("zzzzz\n");
        }

    }while ((a[0]!='3') || (strlen(a)!=2));

Isso funciona. Só tens problemas se tentares algo como:

12341

Ele primeiro repete, e depois escolhe a opção 1.

Isto acontece porque o fgets() lê os primeiros 4 caracteres, e preenche a array com um '\0' no final. Estes 4 não dão, logo ele passa à frente, e lê os próximos caracteres, que são simplesmente '1\n', ou seja, a opção 1.

Tens o mesmo problema para qualquer tamanho de string. No entanto, essa é uma solução razoável. O que podes fazer, para evitar memória dinâmica, é ler caracter a caracter. Caso o segundo caracter seja '\n', então ele inseriu uma opção. Senão, continuas a ler até ao '\n', e repetes.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.