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

Código para de funcionar


luisg5

Pergunta

Pessoal, estou querendo fazer o seguinte, simular que um usuário vai digitar seu nome e sua conta corrente. Digamos que o nome deve ter no máximo 80 caracteres e a conta no máximo 4, então tentei fazer o código abaixo, porém está dando erro e o Dev-C++ fecha.

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char nome[81], contacorrente[5];
    int val;
    printf("Informe seu nome:\n");
    scanf("%80[^\n]", &nome);
    printf("Informe a conta corrente:\n");
    scanf("%4[^\n]", &contacorrente);
    val = atoi(contacorrente);
    printf("Seu nome e: %s\n", nome);
    printf("A conta e: %d", val);
}

O que pode estar acontecendo, alguém pode me explicar?

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Olá, acho que não responderei sua pergunta mas, será que, alternativamente, a função gets() não poderia lhe ajudar?

 

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char nome[81], contacorrente[5];
    int val;
    printf("Informe seu nome:\n");
    gets(nome);
    printf("Informe a conta corrente:\n");
    gets(contacorrente);
    val = atoi(contacorrente);
    printf("Seu nome e: %s\n", nome);
    printf("A conta e: %d", val);

return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • 0
10 horas atrás, Exata0mente disse:

Olá, acho que não responderei sua pergunta mas, será que, alternativamente, a função gets() não poderia lhe ajudar?

Posso lhe dar uns quantos motivos para nunca usar gets mas o principal é que ele pode ler um string de qualquer tamanho, a conseqüência é pode ler textos inclusive maior que seu string.

O erro que está ocorrendo é que você esta tratando uma string como se fosse um char quando você usa scanf troque scanf("%80[^\n]", &nome);
por
scanf("%80[^\n]", nome); //sem &

você não deve por & adiante de ponteiros e strings. Um string nada mais é que um ponteiro que aponta para a posição numero 1 da sua seqüencia de caracteres, então ponteiros e strings guardam relação, por isso você não deve por & adiante de ponteiros e strings, lembre disso.

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

  • 0

Bom dia!

@vangodp, você tem total razão. Fui pesquisar um pouco mais sobre o gets() e é de fato um limitadissímo!

Em 12/11/2016 at 01:05, vangodp disse:

Posso lhe dar uns quantos motivos para nunca usar gets mas o principal é que ele pode ler um string de qualquer tamanho, a conseqüência é pode ler textos inclusive maior que seu string.

O erro que está ocorrendo é que você esta tratando uma string como se fosse um char quando você usa scanf troque scanf("%80[^\n]", &nome);
por
scanf("%80[^\n]", nome); //sem &

você não deve por & adiante de ponteiros e strings. Um string nada mais é que um ponteiro que aponta para a posição numero 1 da sua seqüencia de caracteres, então ponteiros e strings guardam relação, por isso você não deve por & adiante de ponteiros e strings, lembre disso.

@luisg5, lembre-se sempre que o nome de um vetor, é o "endereço" do primeiro elemento deste vetor, logo, não precisaria do & para indicar o endereço do vetor.

Porém, caso você rode seu código fazendo apenas esta modificação, notará que o printf() retornará apenas a string nome.

Acontece que o ENTER que você deu no primeiro scanf() não foi associado à string nome e acabou indo para o buffer. Quando o scanf() para a string contacorrente é chamado, primeiro analisa o buffer, que tem um "\n" o que encerraria a leitura da string contacorrente.

Para resolver isto, será necessário a limpeza do buffer antes de ler a string contacorrente

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

int main(){
  
    char nome[81], contacorrente[5];
    int val;

    printf("Informe seu nome: ");
    scanf("%80[^\n]", nome);

    __fpurge(stdin); /*Para windows use fflush(stdin)*/

    printf("Informe a conta corrente: ");
    scanf("%4[^\n]", contacorrente);

    val = atoi(contacorrente);

    printf("Seu nome e: %s\n", nome);
    printf("A conta e: %d", val);

return 0;
}

Caso queira ver mais:

https://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C?pagina=2
http://www.cprogressivo.net/2012/12/Buffer--o-que-e-como-limpar-e-as-funcoes-fflush-e-fpurge.html

Editado por Exata0mente
não era para enviar, estava incompleto!
Link para o comentário
Compartilhar em outros sites

  • 0

@Exata0mente

41 minutos atrás, Exata0mente disse:

__fpurge(stdin); /*Para windows use fflush(stdin)*/

Posso lhe dar uns quantos motivos para nunca usar fflush mas o principal é que ele não foi criado para trabalhar com o buffer stdin se não com stdout. Conforme seus criadores ele tem "comportamento indefinido" sobre tudo com strings, ou seja, pode funcionar mas também pode falhar.

Recomendaria você ler aqui, sobre tudo por que existem formas mais portaveis de limpar o buffer que funcionam em ambos sistemas:
http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

Leia incluso a resposta dos usuários, alguns aportam muitas coisas ao tema.

>_<

 

50 minutos atrás, Exata0mente disse:

Porém, caso você rode seu código fazendo apenas esta modificação, notará que o printf() retornará apenas a string nome.

você pode usar

    char buffer[10];
    fgets(buffer, 10, stdin);

Em vez de gets. Lembre de limpar o buffer posteriormente >_<.

Link para o comentário
Compartilhar em outros sites

  • 0

Não tudo se aprende em aula. Muitos professores estão desatualizados. Sobre tudo os que vão logo colocando o conio para pausar o programa huahuahhauha.

Os fóruns são um bom lugar para aprender. passe aqui a diário e de uma olhada nas soluções dos usuários. Em fóruns é onde eu aprendi tudo o que sei >_<. Mas não foi perguntando não... posso contar em uma mão as poucas vezes que fiz perguntas em fóruns. Táh! Um pouco mais, mas não tanto. >_<

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...