Ir ao conteúdo
  • Cadastre-se
mariafernanda

RESOLVIDO erro na execução pois quando coloco nome composto da erra, mais quando coloco so primeiro nome da certo

Recommended Posts

#include <stdio.h>#include <stdlib.h>#define nfuncionarios 2typedef struct funcionario{    float salario;    int idade;    char nome[50];}funcionarios;int main(){    funcionarios func[nfuncionarios];    int i;    for(i=0;i<nfuncionarios;i++){        printf("Informe o nome: ");        scanf("%s", func[i].nome);        printf("Informe a idade: ");        scanf("%d", &func[i].idade);    }    for(i=0;i<nfuncionarios;i++){        printf("\nFuncionario %d\n", i+1);        printf("Nome: %s\n", func[i].nome);        printf("Idade: %d", func[i].idade);        printf("\n");    }    return 0;}

erro na execução pois quando coloco nome composto da erra, mais quando coloco so primeiro nome da certo, mais preciso colocar nome composto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Scanf de forma padrão só lê até topar com um espaço branco(' '), um tabulador('\t') e até encontrar('\n') a tecla enter, então para ler ula frase que contenha espaços por exemplo, devemos obrigar ele a fazer o que queremos, utilize o especificador %[^\n]s para isso, é como dizer para o escanf que "leia tudo que não seja '\n' ",então ele vai aceitar espaços. Outra variante é %99[^\n]s, supondo que você tem char nome[100], o scanf que conter %99[^\n]s, somente vai ler 99 letras. Por que só 99? Si você recordar todo o string tem um carácter que indica seu final, si lemos 100, scanf vai por o nulo ao 101, isso é um erro e por isso somente 99. Outra variante mais é %99[^\n]%*c, essa criatura evita que o enter caia ao buffer de entrada causando erros. Cabe destacar que si eu limito a leitura a a 99 caracteres é muito importante saber que acontece com o resto das letras, si eu por exemplo entrar com 110 letras, 99 van a parar no nome, o restante vai ficar no buffer aguardando uma nova função é variável que a retire de aí, a única forma de vaziar o buffer é lendo seu conteúdo.

 

Vamos ver um exemplo:

#include <stdio.h>#include <stdlib.h>int main (){        char frase1[10];    char frase2[50];        printf("Entre con a frase1: ");    scanf("%9[^\n]%*c", frase1);        printf("\nO restante vai parar em frase2 sem sua intervençao: ");    scanf("%49s", frase2);                printf("\n\nfrase1: %s\n", frase1);    printf("frase2: %s", frase2);        getchar();    getchar();    return 0;}

No código acima, si eu entrar mais de 9 letras o resto vai levar o 2 scanf, por isso é importante você limpar o buffer logo depois de fazer uma leitura. É bom pensar que o usuário é como uma criança, si você falar para não por mais de 10 letras ela vai por 100 só para ver seu programa explodir, e você como uma boa programadora vai dizer, "Obrigado senhor usuário, por estourar minha aplicação, e por ligar para o suporte técnico, agora mesmo vou invocar a equipe novamente, gastar outra milhonada para arrumar todos os bugs que causei por causa da minha inexperiência e muito obrigado." :D  hahaha.

 

Acaso você já viu algum programa dizer pra você não por mais de x quantidade de letras? Lógico que não, e si ver ligue pro cara e diga que você pode perfeitamente assumir seu posto XDD. Quem tem que controlar si o usuário entrou ou não com mais chars do permitido é você... Quer uma solução?

void flush_in() {    int ch;    while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}}

Chama essa função logo depois de cada string ou char que ler, ou antes de ler, e assunto resolto. Vamos aplicar isso ao código anterior.

#include <stdio.h>#include <stdlib.h>void flush_in() {    int ch;    while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}}int main (){        char frase1[10];    char frase2[50];        printf("Entre con a frase1: ");    scanf("%9[^\n]s", frase1);    flush_in();        printf("\nAgora pode entrar com a frase2 sem problemas =): ");    scanf("%49s", frase2);        flush_in();        printf("\n\nfrase1: %s\n", frase1);    printf("frase2: %s", frase2);        getchar();    getchar();    return 0;}

Perceba que agora não tem mais problema, pois si ler mais de 9 caracteres o restante vai ficar no buffer, logo a função flush_in se ocupa de esvaziar todas as letras, a função fgetc trabalhando com o parâmetro stdin, vai retirando uma por uma todas as letras que sobrarem no buffer, o resultado é uma leitura correta ao 100%, sem precisar se preocupar si o cliente vai digitar 30 mil chars, como falei, a única forma de vaziar o buffer de entrada é ler seu conteúdo.

 

Si vou ler um único char ou int, antes de outro char ou string, ponho %d%*c, ou simplesmente ponho um espaço antes da segunda leitura como você fez, isso ignora o enter, que certamente é o causante do seu problema. Uma forma correta de fazer essa leitura seria:

#include <stdio.h>#include <stdlib.h>#define NFUNCIONARIOS 2 //NFUNCIONARIOS é uma constante, use maiusculas para constantes ;)typedef struct funcionario{    float salario;    int idade;    char nome[50];}funcionarios;void flush_in() {    int ch;    while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}}int main(){    funcionarios func[NFUNCIONARIOS];    int i;    for(i=0;i<NFUNCIONARIOS;i++){        printf("Dados funcionario %d.\n",i+1);        printf("Informe o nome: ");        scanf("%49[^\n]s", func[i].nome);        flush_in();        printf("Informe a idade: ");        scanf("%d", &func[i].idade);        flush_in();        system("cls");    }    for(i=0;i<NFUNCIONARIOS;i++){        printf("Funcionario %d\n", i+1);        printf("Nome: %s\n", func[i].nome);        printf("Idade: %d", func[i].idade);        printf("\n\n");    }    return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×