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

Não imprime o novo valor da variável


ezbueno

Pergunta

Olá!

Sou iniciante em programação e estou aprendendo a linguagem C. No código abaixo, ao passar um novo valor para a variável c, a mesma não imprime. Alguém poderia me explicar o motivo? 

 

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

int main(){
    
    
    int a = 5;
    float b = 2.5;
    char c = 'a';
    bool d = true; // true = 1, false = 0
    
    //Escrevendo na tela
    printf("\nValor de a = %d", a);
    printf("\nValor de b = %.1f", b);
    printf("\nValor de c = %c", c);
    printf("\nValor de d = %d\n", d); 
    
    printf("\n");
    
    //Lendo valor
    scanf("%d", &a);
    scanf("%f", &b);
    scanf(" %c", &c); //Quando for ler um caracter, coloca-se um espaco depois das aspas
    scanf("%d", &d);
    
    printf("\n");
    
    //Escrevendo na tela
    printf("\nValor de a = %d", a);
    printf("\nValor de b = %.1f", b);
    printf("\nValor de c = %c", c);    
    printf("\nValor de d = %d", d);    
    
    system("pause");
}

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 1
15 horas atrás, ezbueno disse:

scanf(" %c", &c); //Quando for ler um caracter, coloca-se um espaco depois das aspas

Provavelmente é o velho problema da função scanf para ler caracteres e strings. A quebra de linha deixada na leitura de B ficar armazenada no buffer e é inserida para C. Alguns indicam colocar um espaço como você fez, para contornar esse problema, mas para mim nunca funcionou. Aconselho o uso da função fgets e pesquise na internet sobre como limpar o buffer do teclado (stdin).

Editado por Hazzu
Link para o comentário
Compartilhar em outros sites

  • 0

@ezbueno, @Hazzu Boa Tarde!

 

MEMORIA LINEAR

Tempo médio de leitura: 2 minutos


O problema não é de caractere branco na entrada da função scanf que lê 1x caractere, porém é na função scanf sim na da chamada posterior que está gravando no espaço maior que a capacidade da variável e sobrescrevendo na memória variável posterior.

 

Ordem linear de Declaração ( sobrescrevendo-se variável posterior )

Em 19/10/2019 em 01:50, ezbueno disse:

Sou iniciante em programação e estou aprendendo a linguagem C. No código abaixo, ao passar um novo valor para a variável c, a mesma não imprime. Alguém poderia me explicar o motivo? 

Exemplo

int   a = 5;    /* (4) na ordem de criação */   
float b = 2.5;  /* (3) na ordem de criação */   
char  c = 'a';  /* (2) na ordem de criação */
bool  d = true; /* (1) na ordem de criação */

As variáveis do sistema são "criadas" na ordem inversa de sua declaração; prove essa afirmação estudando seus ponteiros. No caso do exemplo a variável bool d terá o menor índice das variáveis na memória (referência), enquanto que a variável int a tem o maior índice delas.

EIxPNZSaQIDLRQkHc96oobbN7sdG3Kc9PUVIskKl

Ainda com relação as variáveis, observe que a variável bool d tem menos memória (1 byte) que uma variável int qualquer (4 bytes). E se somarmos a variável que vem depois dela (na ordem de criação: char c) ou antes dela (na ordem de declaração: char c) teremos uma equivalente variável do tipo short int (2 bytes).

Conclusão

Pois então é justamente o que acontece quando escreve-se scanf ("%d", &d); ao que sabemos de ("%d", ...) essa string de formatação lê 1x inteiro decimal do tipo int (4 bytes). Logicamente que o ponteiro da variável bool d, por conta da string "%d", é visto pela função como um ponteiro para tipo int e acaba por alcançar os bytes da variável char c que vem logo depois (na ordem de criação) zerando-a no início.

 

Obrigado

Editado por britivaldo
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...