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

(Resolvido) Explicação do código


david-ikki

Pergunta

:rolleyes:Olá pessoal !!

Boa noite......eu estou fazendo alguns exercicios e resolvi usar um struct pôs vi algo sobre este, mas eu rodo o código e quando eu digito um espaço na variavel nome, o programinha da poblema por quê ????

Veja código:

#include<stdio.h>
#include<stdlib.h>
struct{
       char nome[50];
       char endereco[50];
       int telefone;
       }dados;
       int main()
       {
           system("color 1f");
           printf("Digite dados:\n\n");
           printf("Nome: ");
           scanf("%s",&dados.nome);
           printf("\nEndereço: ");
           scanf("%s",&dados.endereco);
           printf("\nTelefone: ");
           scanf("%d",&dados.telefone);
           printf("\nNome: %s\n",dados.nome);
           printf("\nEndereco: %s\n",dados.endereco);
           printf("\nTelefone: %d\n\n",dados.telefone);
           system("pause");
           return(0);
           }

Estou aprendendo a usar o struct se tiverem algum material legal envie....beleza..até +...OBRIGADO. :rolleyes:

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Tem dois problemas aí... um deles é o seguinte:

Quando você usa apenas o nome de um array, sem o indice, isso equivale ao ponteiro/endereço pro próprio array.

A função scanf pede como segundo parametro o endereço pra variável onde ele vai guardar o valor lido, por isso você usa o simbolo de endereço (&) geralmente, mas no caso dos array não precisa, por isso que eu disse.

Então em vez de

scanf("%s", &dados.nome);

Você usa:

scanf("%s", dados.nome);

pois dados.nome já é um endereço.

O segundo problema é que a função scanf lê apenas palavras e não frases. Então sempre que tiver um espaço em branco ou um enter, ele vai parar de ler.

Tem duas soluções... a simples e perigosa:

gets(dados.nome);

E a complicada e segura:

fgets(dados.nome, 50, stdin);

(50 é o tamanho maximo que você quer ler)

(stdin é o buffer do teclado)

Link para o comentário
Compartilhar em outros sites

  • 0
aew mnemonic, pode mi dizer porque usar u gets é perigoso??

Usando o fgets, você pode limitar o tamanho do buffer a ser lido. Mas usando o gets normal não. Ou seja, se a sua string tem um tamanho [5] e o usuário digitar dezenas de caracteres, esses caracteres após a posição 5 vão ser escritos em posições não reservadas da memória... na melhor das hipóteses vai apenas escrever lixo na memória, mas na pior das hipóteses pode ser usado pra criar alguma brecha de segurança no seu programa (sobrescrever alguma memória adjacente importante) ou travar o programa.

Em alguns compiladores, se você usa o gets você recebe um warning.

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
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...