Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Ajuda com Menu em C

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Ajuda com Menu em C

    Estou com problemas com o uso do comando fgets e do comando strcmp e gostaria da ajuda de vocês.
    O código está comentado e acho que está bem claro nas partes com o problema. Vou adcionar só a parte que está defeituosa para não precisar postar a função inteira.

    Código:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h> //exit()
    
    void main(void)
    {
    MenuPrincipal();
    }
    
    void MenuPrincipal()
    {
    int escolha;
    char sair[4];
    	printf("\033[2J");
    	printf("Por favor escolha uma opcao:\n");
    	printf("1.Novo\n2.Carregar\n3.Sair\n\n");
    	printf("Selecione: ");
    	scanf("%i", &escolha);
    	switch(escolha)
    	{
    	case 1:
    		printf("Chama funcao novo");	//implementar
    		break;
    	case 2:
    		printf("Chama funcao carregar");	//implementar
    		break;
    	case 3:
    		printf("Tem certeza que deseja sair?\n");
    		scanf("%s", &sair);		//Vai para pegar a string mas não compara corretamente nem com while nem com if
    //		fgets(sair,3,stdin);	//O fgets está ignorando a função if e a função while(se usada)
    		if(strcmp(sair,"Sim") || (sair,"SIM") || (sair,"sim") || (sair,"s") || (sair,"S")!=0)	//strcmp para comparar string //Usar while ou if?
    		{	//Se eu usar "==0" o programa roda, se eu usar "==1" dá erro de comperação entre ponteiro e inteiro
    			printf("Finalizando programa, obrigado por testar!\n");
    			printf("Pressione qualquer tecla para continuar...\n");
    			getchar();
    			exit(0);
    		}
    		else if(strcmp(sair,"Nao") || (sair,"NAO") || (sair,"nao") || (sair,"n") || (sair,"N")!=0)
    		{
    			MenuPrincipal();
    		}
    		else
    		{
    			printf("Por favor insira uma opcao valida (Sim/Nao)\n");
    			printf("Pressione qualquer tecla para continuar...\n");
    			getchar();
    			MenuPrincipal();
    		}
    	default:
    		printf("Por favor insira uma opcao valida\n");
    		printf("Pressione qualquer tecla para continuar...\n");
    		getchar();
    		MenuPrincipal();
    	}	//Fim do switch(escolha)
    }		//Fim do MenuPrincipal()

    A função if ou while independente de qual eu usar não está comparando as strings com o strcmp corretamente, já alterei entre gets, fgets e scanf como podem ver o fgets está até comentado ali, nem apaguei que é para saber que já tentei.

    Se alguém souber porque o código não compara as strings e não funciona corretamente eu fico agradecido, preciso dessa ajuda.

    Shalom!
    sigpic
    Eis que estou à porta, e bato; se alguém ouvir a minha voz, e abrir a porta,
    entrarei em sua casa, e com ele cearei, e ele comigo. (Apocalipse 3:20)

    https://twitter.com/jackads
    http://www.facebook.com/jackson.beneteferreira

  • Font Size
    #2
    Postado Originalmente por jackads Ver Post
    Estou com problemas com o uso do comando fgets e do comando strcmp e gostaria da ajuda de vocês.
    O código está comentado e acho que está bem claro nas partes com o problema. Vou adcionar só a parte que está defeituosa para não precisar postar a função inteira.

    Código:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h> //exit()
    
    void main(void)
    {
    MenuPrincipal();
    }
    
    void MenuPrincipal()
    {
    int escolha;
    char sair[4];
    	printf("\033[2J");
    	printf("Por favor escolha uma opcao:\n");
    	printf("1.Novo\n2.Carregar\n3.Sair\n\n");
    	printf("Selecione: ");
    	scanf("%i", &escolha);
    	switch(escolha)
    	{
    	case 1:
    		printf("Chama funcao novo");	//implementar
    		break;
    	case 2:
    		printf("Chama funcao carregar");	//implementar
    		break;
    	case 3:
    		printf("Tem certeza que deseja sair?\n");
    		scanf("%s", &sair);		//Vai para pegar a string mas não compara corretamente nem com while nem com if
    //		fgets(sair,3,stdin);	//O fgets está ignorando a função if e a função while(se usada)
    		if(strcmp(sair,"Sim") || (sair,"SIM") || (sair,"sim") || (sair,"s") || (sair,"S")!=0)	//strcmp para comparar string //Usar while ou if?
    		{	//Se eu usar "==0" o programa roda, se eu usar "==1" dá erro de comperação entre ponteiro e inteiro
    			printf("Finalizando programa, obrigado por testar!\n");
    			printf("Pressione qualquer tecla para continuar...\n");
    			getchar();
    			exit(0);
    		}
    		else if(strcmp(sair,"Nao") || (sair,"NAO") || (sair,"nao") || (sair,"n") || (sair,"N")!=0)
    		{
    			MenuPrincipal();
    		}
    		else
    		{
    			printf("Por favor insira uma opcao valida (Sim/Nao)\n");
    			printf("Pressione qualquer tecla para continuar...\n");
    			getchar();
    			MenuPrincipal();
    		}
    	default:
    		printf("Por favor insira uma opcao valida\n");
    		printf("Pressione qualquer tecla para continuar...\n");
    		getchar();
    		MenuPrincipal();
    	}	//Fim do switch(escolha)
    }		//Fim do MenuPrincipal()

    A função if ou while independente de qual eu usar não está comparando as strings com o strcmp corretamente, já alterei entre gets, fgets e scanf como podem ver o fgets está até comentado ali, nem apaguei que é para saber que já tentei.

    Se alguém souber porque o código não compara as strings e não funciona corretamente eu fico agradecido, preciso dessa ajuda.

    Shalom!
    Código:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h> //exit()
    
    void main(void)
    {
    MenuPrincipal();
    }
    
    void MenuPrincipal()
    {
    int escolha;
    char sair[4];
    	printf("\033[2J");
    	printf("Por favor escolha uma opcao:\n");
    	printf("1.Novo\n2.Carregar\n3.Sair\n\n");
    	printf("Selecione: ");
    	scanf("%d", &escolha);
    	switch(escolha)
    	{
    	case 1:
    		printf("Chama funcao novo");	//implementar
    		break;
    	case 2:
    		printf("Chama funcao carregar");	//implementar
    		break;
    	case 3:
    		printf("Tem certeza que deseja sair?\n");
    		scanf("%s", &sair);		//Vai para pegar a string mas não compara corretamente nem com while nem com if
    		if(sair[0]=='S' || sair[0]=='s')
    		{	
    			printf("Finalizando programa, obrigado por testar!\n");
    			printf("Pressione qualquer tecla para continuar...\n");
    			getchar();
    			exit(0);
    		}
    		else if(sair[0]=='N' || sair[0]=='n')
    			MenuPrincipal();
    		else
    		{
    			printf("Por favor insira uma opcao valida (Sim/Nao)\n");
    			printf("Pressione qualquer tecla para continuar...\n");
    			getchar();
    			MenuPrincipal();
    		}
    	default:
    		printf("Por favor insira uma opcao valida\n");
    		printf("Pressione qualquer tecla para continuar...\n");
    		getchar();
    		MenuPrincipal();
    	}	//Fim do switch(escolha)
    }		//Fim do MenuPrincipal()

    Comment


    • Font Size
      #3
      Que compilador está usando? To tentando rodar aqui mas da alguns erros, já resolvi a maioria, porém faz tempo que não programo em C, quando conseguir te ajudo, ou quando vc conseguir posta aí a solução.

      Comment


      • Font Size
        #4
        Postado Originalmente por arkimonde Ver Post
        Código:
        #include <stdio.h>
        #include <string.h>
        #include <stdlib.h> //exit()
        
        void main(void)
        {
        MenuPrincipal();
        }
        
        void MenuPrincipal()
        {
        int escolha;
        char sair[4];
        	printf("\033[2J");
        	printf("Por favor escolha uma opcao:\n");
        	printf("1.Novo\n2.Carregar\n3.Sair\n\n");
        	printf("Selecione: ");
        	scanf("%d", &escolha);
        	switch(escolha)
        	{
        	case 1:
        		printf("Chama funcao novo");	//implementar
        		break;
        	case 2:
        		printf("Chama funcao carregar");	//implementar
        		break;
        	case 3:
        		printf("Tem certeza que deseja sair?\n");
        		scanf("%s", &sair);		//Vai para pegar a string mas não compara corretamente nem com while nem com if
        		if(sair[0]=='S' || sair[0]=='s')
        		{	
        			printf("Finalizando programa, obrigado por testar!\n");
        			printf("Pressione qualquer tecla para continuar...\n");
        			getchar();
        			exit(0);
        		}
        		else if(sair[0]=='N' || sair[0]=='n')
        			MenuPrincipal();
        		else
        		{
        			printf("Por favor insira uma opcao valida (Sim/Nao)\n");
        			printf("Pressione qualquer tecla para continuar...\n");
        			getchar();
        			MenuPrincipal();
        		}
        	default:
        		printf("Por favor insira uma opcao valida\n");
        		printf("Pressione qualquer tecla para continuar...\n");
        		getchar();
        		MenuPrincipal();
        	}	//Fim do switch(escolha)
        }		//Fim do MenuPrincipal()

        Irmão, você vai ganhar um Obrigado pela sua intenção em ajudar, mas sua solução não resolve o problema, eu quero um "console inteligente", entende? Então se eu digitar "Sim, SIM ou sim" ele vai saber que eu quis dizer "sim", da forma que você propôs aqui:

        Código:
        if(sair[0]=='S' || sair[0]=='s')
        Ele só compara a primeira letra, isso é malandragem e não é uma boa prática de programação, isso é mais conhecido como POG, pois se eu digitar "Sua", "seu", "som", "su", "sw" ou qualquer combinação de letras que contenha "s" no início o código vai passar, e não é isso que eu quero entende?

        Vai ganhar um obrigado pela intenção de ajudar, afinal de contas ninguém mais respondeu, mas sua solução não é a melhor.

        Os programadores Caio Takano e Marcelo Miguel me deram umas dicas e por fim consegui fazer o código funcionar com a indicação do Caio Takano fazendo uso do "tolower()" e da biblioteca "ctype.h".

        Para quem tiver essa mesma dúvida no futuro, gostar de estudar e quiser aprender como faz, deixei o código comentado para os iniciantes entenderem melhor, o código ficou assim:

        Código:
        case 4:
        	printf("Tem certeza que deseja sair?\n");
        	scanf("%s", &sair);		//Vai para pegar a string 
        
        //Transforma toda a string para minusculo
        	for(i=0;i<=3;i++){sair[i]=tolower(sair[i]);}	
        	
        	if(strcmp(sair,"sim")==0)	//Compara string
        	{
        		printf("Finalizando programa, obrigado por testar!\n");
        		printf("Pressione qualquer tecla para continuar...\n");
        		getchar();
        		exit(0);
        	}
        	else if(strcmp(sair,"nao")==0)
        	{
        		MenuPrincipal();
        	}
        	else
        	{
        		printf("Por favor insira uma opcao valida (Sim/Nao)\n");
        		printf("Pressione qualquer tecla para continuar...\n");
        		getchar();
        		MenuPrincipal();
        	}
        	break;

        Aqui tem poucos programadores de C, ainda bem que desde o momento que eu postei o tópico de ajuda eu fui tentando de outras formas e procurando ajuda de outras pessoas, a gente precisa treinar o pessoal melhor em C aqui. Leiam o livro que eu postei Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar..., vamos estudar mais galera, imaginem se o guia do hacker estivesse desenvolvendo uma ferramenta em C e aparecesse um problema desses? 36 pessoas olharam e só uma respondeu, vamos fazer uma corrida de estudos de programação aí pra galera ficar mais sagaz!


        Shalom!
        sigpic
        Eis que estou à porta, e bato; se alguém ouvir a minha voz, e abrir a porta,
        entrarei em sua casa, e com ele cearei, e ele comigo. (Apocalipse 3:20)

        https://twitter.com/jackads
        http://www.facebook.com/jackson.beneteferreira

        Comment


        • Font Size
          #5
          Postado Originalmente por Dano Ver Post
          Que compilador está usando? To tentando rodar aqui mas da alguns erros, já resolvi a maioria, porém faz tempo que não programo em C, quando conseguir te ajudo, ou quando vc conseguir posta aí a solução.
          Irmão não há nenhum erro no código, provavelmente os erros que você está encontrando é devido que você deve usar windows e eu linux, as bibliotecas que usamos algumas são diferentes e a sintaxe dos comandos também, por isso você deve estar encontrando erros, mas no linux o código funciona normal tanto é que para outras pessoas que mandei o código elas conseguiram compilar e não encontraram erros.

          Código:
          gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)
          Obrigado pela intenção de ajudar irmão, a solução está aí no post de cima.


          Shalom!
          sigpic
          Eis que estou à porta, e bato; se alguém ouvir a minha voz, e abrir a porta,
          entrarei em sua casa, e com ele cearei, e ele comigo. (Apocalipse 3:20)

          https://twitter.com/jackads
          http://www.facebook.com/jackson.beneteferreira

          Comment


          • Font Size
            #6
            36 pessoas olharam e só uma respondeu, vamos fazer uma corrida de estudos de programação aí pra galera ficar mais sagaz!
            Gente me desculpe se eu pareci muito exigente quanto ao tempo de resposta, ok!? Minha intenção não foi essa, eu sei que depende da disposição de alguém vir e responder, estou comentando isso pois um amigo comentou e relendo realmente pode parecer que fui exigente mas não foi essa minha intenção ok?


            Aqui tem poucos programadores de C, ainda bem que desde o momento que eu postei o tópico de ajuda eu fui tentando de outras formas e procurando ajuda de outras pessoas, a gente precisa treinar o pessoal melhor em C aqui.
            Quero deixar bem claro também que eu não quis dizer aqui que alguém programe mais ou menos que o outro, eu comentei que tem poucos programadores porque tem mesmo e que nós devíamos incentivar mais o pessoal a programar, e não que "tem poucos programadores" no sentido de que o pessoal que programa é mal programador e ruim no que faz, ok?

            Minha intenção não é floodar, é só esclarecer tudo para que não haja nenhuma confusão da parte de ninguém pois acho que devemos sempre ter muita humildade para falar com os outros e talvez eu possa parecer que eu faltei com humildade nas postagens, não é isso ta galera? Também não sou "programador bonzão" senão eu não estaria tirando dúvidas e já saberia tudo.

            Qualquer dúvida perguntem também que farei tudo para ajudar e aprenderemos todos juntos...


            Shalom!
            sigpic
            Eis que estou à porta, e bato; se alguém ouvir a minha voz, e abrir a porta,
            entrarei em sua casa, e com ele cearei, e ele comigo. (Apocalipse 3:20)

            https://twitter.com/jackads
            http://www.facebook.com/jackson.beneteferreira

            Comment


            • Font Size
              #7
              Ai amigo entrei no forum hoje e vi sua duvida, resolvi aki vou postar o codigo pra voce!
              #include <stdio.h>
              #include <string.h>
              #include <stdlib.h> //exit()

              void main(void)
              {
              MenuPrincipal();
              }

              void MenuPrincipal()
              {
              int escolha;
              char sair[4];
              printf("\033[2J");
              printf("Por favor escolha uma opcao:\n");
              printf("1.Novo\n2.Carregar\n3.Sair\n\n");
              printf("Selecione: ");
              scanf("%i", &escolha);
              switch(escolha)
              {
              case 1:
              printf("Chama funcao novo"); //implementar
              break;
              case 2:
              printf("Chama funcao carregar"); //implementar
              break;
              case 3:
              printf("Tem certeza que deseja sair?\n");
              scanf("%s", &sair); //Vai para pegar a string mas não compara corretamente nem com while nem com if
              // fgets(sair,3,stdin); //O fgets está ignorando a função if e a função while(se usada)
              if(!strcmp(sair,"Sim") || !strcmp(sair,"SIM") || !strcmp(sair,"sim") || !strcmp(sair,"s") || !strcmp(sair,"S")) //strcmp para comparar string //Usar while ou if?
              { //Se eu usar "==0" o programa roda, se eu usar "==1" dá erro de comperação entre ponteiro e inteiro
              printf("Finalizando programa, obrigado por testar!\n");
              printf("Pressione qualquer tecla para continuar...\n");
              getchar();
              exit(0);
              }
              else if(strcmp(sair,"Nao") || strcmp(sair,"NAO") || strcmp(sair,"nao") || strcmp(sair,"n") || strcmp(sair,"N"))
              {
              MenuPrincipal();
              }
              else
              {
              printf("Por favor insira uma opcao valida (Sim/Nao)\n");
              printf("Pressione qualquer tecla para continuar...\n");
              getchar();
              MenuPrincipal();
              }
              default:
              printf("Por favor insira uma opcao valida\n");
              printf("Pressione qualquer tecla para continuar...\n");
              getchar();
              MenuPrincipal();
              } //Fim do switch(escolha)
              } //Fim do MenuPrincipal()


              A função strcmp retorna 0 se as strings forem iguais e maior que 0 se tiverem valores sintaticos maiores,
              voce estava pondo isso "if(strcmp(sair,"Sim") || (sair,"SIM") || (sair,"sim") || (sair,"s") || (sair,"S")!=0)"
              correção: "if(strcmp(sair,"Sim") || KD,oSTRCMPdaki?(sair,"SIM") || KD,oSTRCMPdaki?(sair,"sim") || KD,oSTRCMPdaki?(sair,"s") ||KD,oSTRCMPdaki? (sair,"S") !=0 você ta comparando apenas o ultimo OU )"

              correto "if(!strcmp(sair,"Sim") || !strcmp(sair,"SIM") || !strcmp(sair,"sim") || !strcmp(sair,"s") || !strcmp(sair,"S"))" como esse if é para verificar se a função strcmp retorna 0 entao, se !strcmp(sair,"sim") ou seja se a função foi igual a 0 (c nao tem tipo boleano, mas nas avaliações do return se forem falsas retorna 0 e se verdadeiras retorna 1) entra no bloco de codigo.

              nao sei se expliquei bem , mas da uma olhada ai que você vai sakar!
              vlw!

              Comment


              • Font Size
                #8
                Então irmão, obrigado por responder mas como pode ver o problema já tinha sido resolvido e a solução que cheguei aqui ficou melhor.

                De qualquer forma muito obrigado, Shalom!
                sigpic
                Eis que estou à porta, e bato; se alguém ouvir a minha voz, e abrir a porta,
                entrarei em sua casa, e com ele cearei, e ele comigo. (Apocalipse 3:20)

                https://twitter.com/jackads
                http://www.facebook.com/jackson.beneteferreira

                Comment

                X
                Working...
                X