Ir para conteúdo
Fórum Script Brasil
  • 0

Duvida sobre erro em um algoritmo em C


John Cunha

Pergunta

Fiz um programa com o seguinte comando: "Ler nome, sexo e idade. Se sexo for feminino e idade menor que 25, imprime o nome da
pessoa e a palavra “ACEITA”, caso contrario imprimir “NÃO ACEITA”.". Fiz o programa porém quando digito sexo 'feminino' e idade abaixo de 25 ele retorna "Não aceito" ao invés de "Aceito". O que pode tá errado no meu código?

Código:

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

int main(){

setlocale(LC_ALL, "Portuguese_Brazil");

char nome[200];
int idade;
char sexo[50];

setbuf(stdin, NULL);

printf("Digite seu nome: ");
gets(nome);

printf("Digite seu sexo: ");
gets(sexo);

printf("Digite sua idade: ");
scanf("%d",&idade);

if(sexo=="feminino" && idade<25){
printf("\\n%s\\n",nome);
printf("Situação: Aceita.\\n");
}else{
printf("\\n%s\\n",nome);
printf("Situação: Não aceita.\\n");
}

return 0;
}

OBS: Não quero apenas outra forma de escrever o programa(mas se quiser pode colocar), quero saber porque esse código está dando errado!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Olá, @John Cunha Em C não se compara strings com o '==', para comparar strings é necessário fazer uso da função strcmp da biblioteca <string.h>

segue um exemplo usando seu código para entender isso:

if(!strcmp(sexo, "feminino") && idade < 25) { // ou strcmp(sexo, "feminino") == 0
    printf("\n%s\n",nome);
    printf("Situação: Aceita!\n");
} else {
    printf("\n%s\n",nome);
    printf("Situação: Não aceita.\n");
}

Entenda que o caractere de escape para quebra de linha é '\n'. Se você fizer '\\n' você vai imprimir a barra e, logo em seguida, a letra n

Também não recomendo, de forma alguma, o uso do comando gets para ler uma string. Isso porque esse comando é considerado um comando perigoso. Use o comando scanf ou, se preferir, o fgets

Exemplo do uso do scanf para ler o nome e sobrenome (por exemplo):

char nome[50];

printf("Digite seu nome: ");
scanf(" %49[^\n]", nome); // os espaços antes do % é para ignorar qualquer espaço digitado pelo usuário antes do nome

 

Para entender a lógica desse scanf: toda string termina com o caractere nulo ('\0'). Logo, se a string for definida com tamanho 50 é preciso limitar o tamanho da string para que não seja armazenada na mesma mais de 50 posições, por isso o %49. É 49 pois já está sendo considero o caractere '\0' (totalizando 50) que incluído no final da string digitada de maneira automática

Para entender melhor sobre strings em C, recomendo esse tutorial:

http://www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap06.pdf

Outro ponto, para concluir: não recomendo também o uso do comando setbuf(stdin, NULL); para limpar a sujeira do buffer (ou limpar o stdin). Segue duas funções que você pode usar para evitar esse comando, como também o comando fflush(stdin):

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

Ou essa função:

void fflush_stdin() {
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
}

Para usar uma dessas funções segue um exemplo:

printf("Digite seu nome: ");
scanf(" %49[^\n]", nome);
limpa_linha();

Se tiver alguma dúvida quanto a alguma parte do que foi dito aqui fique a vontade para perguntar, ok?

Editado por Visitante
Correção na resposta
Link para o comentário
Compartilhar em outros sites

  • 0

@John Cunha Apenas para você entender a importância de limpar a sujeira do buffer (limpar o stdin) de maneira prática:

Execute o código abaixo usando e depois não usando uma das funções que estão no código:

#include <stdio.h>
#include <locale.h>

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

void fflush_stdin() {
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
}

int main() {

    setlocale(LC_ALL, "Portuguese");

    char ch;
    int i;

    for (i = 0; i < 5; i++) {
        printf("Digite o %dº caractere: ", i + 1);
        scanf("%c", &ch);
        limpa_linha(); // ou fflush_stdin();
    }

    return 0;
}

É extremamente importante que toda pessoa que esteja começando a estudar a linguagem C entenda a respeito desse assunto e a como contornar esse "problema" de maneira adequada. 

Obs: Esse "problema" também ocorre com o C++ e Java (por exemplo), mas normalmente não é explicado d maneira adequada a respeito disso (infelizmente)

Editado por Visitante
correção na resposta
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...