Ir ao conteúdo

Posts recomendados

Postado

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;
}

 

  • Membro VIP
Postado

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

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

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

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!