Ir ao conteúdo
  • Cadastre-se

C Nome do vendedor, salário + bônus


immoraesz

Posts recomendados

O programa está correto, porém no printf que mostra o nome do vendedor + salário com adição do bônus está tendo uma quebra de linha inesperada.

Deveria aparecer: O salario de Amanda sera de R$ 75000.00

Está aparecendo: O salario de Amanda

sera de R$ 75000.00

Como resolvo esse problema?

 

#include <string.h>

int main(){
    
    float salario, bonus, total, adicional;
    char vendedor[20];
    
    fgets( vendedor, 20, stdin);
    
    scanf("%f", &salario);
    scanf("%f", &bonus);
    
    adicional = ((bonus * 15) / 100);
    total = salario + adicional;
    
    printf("O salario de %s sera de R$ %.2f", vendedor, total);
    
  return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Use gets()

	gets(vendedor);
    scanf("%f", &salario);
    scanf("%f", &bonus);
    
    adicional = ((bonus * 15) / 100);
    total = salario + adicional;
    
    printf("O salario de %s sera de R$ %.2f", vendedor, total);
    

main.c:(.text+0x23): warning: the `gets' function is dangerous and should not be used.

Portanto melhor com scanf mesmo

scanf("%s",vendedor);
scanf("%f", &salario);
scanf("%f", &bonus);

 

Amanda
50000
50000
O salario de Amanda sera de R$ 57500.00

Link para o comentário
Compartilhar em outros sites

36 minutos atrás, immoraesz disse:

está tendo uma quebra de linha inesperada

Não há nada de inesperado aqui, está na documentação da fgets():

Citação

O caractere de nova linha, se lido, é incluído na cadeia de caracteres.

Eu falei sobre isso no seu outro tópico, e mostrei um exemplo:

Citação

O que se pode fazer é verificar se há um '\n' na penúltima posição da string após ler com fgets(). Caso haja, o substituímos por um '\0', e caso não haja, podemos ler o que resta no fluxo:

char str[101];

if(fgets(str, sizeof(str), stdin) != NULL) {
    if(str[strlen(str) - 1] == '\n') {
        // '\n' na penultima posição da string
        str[strlen(str) - 1] = '\0';
    } else {
        int ch;
        // Lendo o que ha de resto
        while((ch = fgetc(stdin)) != '\n' && ch != EOF);
    }
}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

5 minutos atrás, JorgeGus disse:
vendedor[strcspn(vendedor, "\n")] = 0;

Adicione essa linha depois de fgets para substituir a quebra de linha por um final de string.

Acredite, o autor vai usar isso sem sequer saber o que quer dizer, assim como vem usando fgets() sem saber de seu comportamento peculiar (o pessoal vem aqui querendo uma resposta curta sem ter que se esforçar pra entender). 🤪

 

Estamos interessados no retorno de strcspn(), e na documentação é dito:

Citação

Retorna o índice da primeira ocorrência, em uma cadeia de caracteres, de um caractere que pertence a um conjunto de caracteres.

No nosso caso, se um '\n' for encontrado, strcspn() retorna seu índice para que possamos atribuir um '\0', caso contrário, retorna o tamanho da string que seria a posição em que se encontra o terminador '\0'.

De qualquer forma, é sempre bom testar o retorno de fgets():

Citação

NULL é retornado para indicar um erro ou uma condição de fim de arquivo.

E veja, se strcspn() = strlen(), provavelmente o usuário digitou mais do que deveria, e daí poderia ser efetuada uma leitura do que resta no fluxo.

19 minutos atrás, Lucca Rodrigues disse:
char str[101];

if(fgets(str, sizeof(str), stdin) != NULL) {
    if(str[strlen(str) - 1] == '\n') {
        // '\n' na penultima posição da string
        str[strlen(str) - 1] = '\0';
    } else {
        int ch;
        // Lendo o que ha de resto
        while((ch = fgetc(stdin)) != '\n' && ch != EOF);
    }
}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá @immoraesz essa é a segunda postagem que vejo, e na mesma página, em que um usuário tem "bronca" com 'gets/fgets' por razão do NL que persiste (quando deve) na captura.

 

Como disseram, quase sempre captará esse caractere, logo melhor optar pela função 'scanf'.

 

# Exemplo:

Citação

 

Há um exercício da linguagem em que se deve lê uma palavra de (máximo) 19 caracteres(*)  via prompt e mostrar a sua primeira e última letra.

 

 

(*) Nota-se que a função 'fgets' nessa situação não é recomendada porque toda palavra numa 'string' com menos que 19 caractere terá NL quando é indesejado. Uma perfeita situação para usar 'scanf' sendo bem melhor que a 'fgets' + inspeção de caractere explicitamente.

 

C' 

/*******************************************************************************
*******************************************************************************/
#include"stdio.h" // scanf printf
int
main(void)
{
        char palavra_as_string[20] = {""}; int n = 0;
        printf("Ola tudo bem? Digite uma palavra (2-19 letras)\n"
               "que te direi sua 1st e Xnd letra ? ");
               
        scanf(" %19[^ \n]%n", palavra_as_string, &n);
        
        if (n > 1) {
                printf("\n\n");
                
                printf("Na posicao\n");
                printf(".1st tem %c\n"
                       ".Xnd tem %c\n\n", palavra_as_string[0],
                       palavra_as_string[n - 1]);
                       
                printf("Destaquei sua primeira e ultima letra\n");
                printf("%s\n", palavra_as_string);
                printf("^%*s^\n", n - 2, "");
        }
        return 0;
}

 

É muita coisa só para mostrar um uso da 'scanf'? Talvez, porém a intenção é mostrar um exercício da linguagem sem "murros em ponta de faca"

[:)

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...