Ir ao conteúdo

C fgets() não deixa mostrar a string


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

Boa noite, em um exercício me deparei com uma dúvida, com nome composto o algoritmo só funciona até digitar o nome e apertar enter, depois disso ele não funciona, e antes ele funcionou porém mostrou só depois do tamanho definido pela string que é 10, segue o código:

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

int main(){

    char nome[10];

    printf("Digite o seu nome: ");
    fflush(stdin);
    fgets(nome,10,stdin);
    scanf("%s",nome);
    printf("O nome digitado é:%s",nome);

    return 0;
}

 

  • Obrigado 1
  • Solução
Postado

@iTzCrazy Boa noite!

O programa "pausa" na 'scanf' após leitura da 'fgets', na verdade, aguarda o recebimento de mais informações! Digite um texto (de no máximo 9 caracteres) e tecla ENTER.

  • Curtir 2
  • Obrigado 1
Postado

@mauro_b muito obrigado pela informação, eu fiz os testes e identifiquei que o scanf só permite até o espaço, o fgets exibe somente até o tamanho definido, já o gets parece ser ilimitado, por favor me corrija se estiver errado, vou ler mais sobre esses 3, muito obrigado pela informação a partir dela vou conseguir continuar, valeu!

  • Curtir 1
  • Amei 1
Postado

@iTzCrazy    antes ele funcionou com scanf ?  ,   e só leu o primeiro nome ?  ,   o scanf do jeito que você colocou funciona assim mesmo ,  lê  os caracteres que estão juntos até encontrar um espaço em branco ,  e o restante será ignorado ,  e se você quer ler nomes compostos você pode usar o scanf com modificações  :

scanf("%[^\n]%*c",nome);

e você pode ter mais informações nesse link :

https://www.clubedohardware.com.br/forums/topic/1411296-qual-a-diferença-entre-fgets-e-scanf-em-c/

 

e fgets pega todos os caracteres digitados e também a tecla ENTER que é representada por esse caractere"\n" , e outra coisa é que  para essa string , 

char nome[10]; // reserva 10 posições na memoria

 ,  foi reservado 10 posições na memória , só pode armazenar 9 caracteres digitados , pois o décimo caractere será o "\n" que ocupará a última posição .

e a função gets já está em desuso há muito tempo , melhor não usá-la , 

  • Curtir 3
Postado

Tudo isso!

 

E além dessas alternativas existe outra pouca /ou nada discutida, principalmente porque envolve duas variáveis além do ponteiro necessário para alocação dinâmica de memória, sendo a alocação dinâmica o seu pior contra, já que implica na liberação da memória após não ser mais necessária, um serviço extra que incomoda às vezes!

 

Essa função é a GETLINE

Citação

Descrição: A função getline deve ler o stream até encontrar um caractere que corresponda ao caractere delimitador (o caractere delimitador igual ao caractere <newline>). Se o argumento delimitador tiver qualquer outro valor, o comportamento será indefinido.

 

Valor de Retormo: Após a conclusão bem-sucedida, as funções getline() deve retornar o número de bytes gravados no buffer, incluindo o caractere delimitador, se encontrado antes do EOF, mas excluindo o caractere NULL final. Se o indicador de fim de arquivo para o fluxo for definido, ou se nenhum caractere for lido e o fluxo estiver no fim de arquivo, o indicador de fim de arquivo para o fluxo deverá ser definido e a função retornará - 1. Se ocorrer um erro, o indicador de erro para o fluxo deve ser definido e a função deve retornar -1 e definir errno para indicar o erro.

 

Observo sendo semelhante, pelo menos no processo de entrada, com a 'fgets'

Para um exemplo escrevo um programa que digitada uma lista de números positivos inteiros exibirá respectivamente seus fatoriais. Usarei a função na captura dessa lista (linha) de números (“strings”), após conversão para inteiro no programa calcula-se o fatorial, exibe-se o resultado, aponta para hipoteticamente a próxima “strings” e repete tudo enquanto não falhar a conversão de ‘texto’ para número.

 

{C}

#include"stdio.h"
#include"stdlib.h"
int
main (void) {
  char *nums_como_strings = NULL;
  long unsigned capacidade = 0;

  //GETLINE
  //se voltar como esperado, 'sucesso' tem  tamanho (>0) da strings
  //e 'capacidade' tem o numero em bytes alocados
  int sucesso = getline (&nums_como_strings, &capacidade, stdin) - 1;
  if (sucesso < 0) {
     return EXIT_FAILURE;
     }
  unsigned num = 1, fatorial = 1;
  int proximo = 0;
  while (sscanf (nums_como_strings, "%u%n", &num, &proximo) == 1) {
        for (unsigned i = 1; i <= num; ++i) {
            fatorial*= i;
            }
        printf ("%u! %u\n", num, fatorial);


        nums_como_strings+= proximo;

        num = 1, fatorial = 1;
        proximo = 0;
        }
  free (nums_como_strings - sucesso);
  (void) sucesso;
  return EXIT_SUCCESS;
  }

[SAÍDA]

fatorial_show.gif.73bfabc5ba7ce1a4fcec6fe736e03139.gif

 

[🙂] — espero que ajude! 

 

  • Curtir 1
  • Obrigado 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...