Ir ao conteúdo

C Alguém sabe porque a linha do scanf está anulando a função (lerstring) ?


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Postado

Estou com uma dúvida sobre um código em C que estou escrevendo, quando tento chamar a função lerstring ela não é lida, porém se eu comentar a linha do scanf acima dela o código funciona normalmente, ou seja, o scanf está anulando a função. Alguém pode me ajudar? Sou novo no Clube do Hardware, caso eu tenho feito algo de errado ou postado a dúvida de forma errada peço paciência.


 

#include <stdio.h>
#include <string.h>

void lerstring(char str[], int max)
{
     fgets(str, max, stdin);
    if (str[strlen(str)-1]=='\n')
        str[strlen(str)-1] = '\0';
    else
    {
        char lixo[10];
        do{
            fgets(lixo, 10, stdin);        
        }while (!feof(stdin) && lixo[strlen(lixo)-1]!='\n');
    } 
}

int main()
{
    char listaNomes [100][30];
    int i, qtd;
    char nome[30];
    double n1,n2;
    
    scanf ("%d",&qtd);
    lerstring(listaNomes[i],30); 
    printf ("%s",listaNomes[0],30);
    
    return 0;
}

 

Postado

@mauricioqueiroz93       voce  nao inicializou a variavel  i  ,  que pode ter qualquer valor e apontar para uma posicao inexistente do vetor listaNomes ,  e la na funcao lerstring a variavel str seria melhor informar o tamanho dela , que no maximo pode ser de 29 caracteres e deixar hum para o  "\0" , e no Ultimo printf voce colocou um numero 30 que nao vai servir para nada   , mas tudo bem ele nao atrapalha nada nao .

  • Curtir 2
Postado

 

5 horas atrás, mauricioqueiroz93 disse:

o scanf está anulando a função

Deve ser por causa do buffer do teclado depois do scanf, uma forma de evitar isso é colocar "%*c" no formato,

scanf("%d%*c", &qtd);

 

  • Curtir 2
  • Solução
Postado

@mauricioqueiroz93 

5 horas atrás, mauricioqueiroz93 disse:

scanf está anulando a função.

lerstring() não está sendo anulada, mas é fato que os dados não estão sendo todos consumidos pela scanf().

O motivo disso? Veja:

#include <stdio.h>

int main()
{
    int x;
    char c;
    
    printf("Digite um numero: ");
    scanf("%d", &x);
    
    printf("Digite um caractere: ");
    scanf("%c", &c);
    
    printf("Respostas: <%d> <%c>", x, c);
    
    return 0;
}

Na saída:

image.png.e0ce5a2d43415e126fcc6fc8cdd420bd.png

Isso ocorre porque eu digitei '5' e '\n' (Enter), como o '\n' não interessa na leitura de um inteiro, ele permanece na stdin até que você o leia, e foi o que aconteceu quando eu chamei a scanf() novamente, o '\n' foi lido e armazenado na variável c.

Pra solucionar isso, você pode ler e ignorar esse caractere com um especificador da seguinte forma: %*c.

Veja:

#include <stdio.h>

int main()
{
    int x;
    char c;
    
    printf("Digite um numero: ");
    scanf("%d%*c", &x);
    
    printf("Digite um caractere: ");
    scanf("%c%*c", &c);
    
    printf("Respostas: <%d> <%c>", x, c);
    
    return 0;
}

Na saída:

image.png.23f93342f0e1be83ac39d1ad7f75e23d.png

Agora está tudo certo :)

 

Alguns outros erros:

5 horas atrás, mauricioqueiroz93 disse:

printf ("%s",listaNomes[0],30);

Você colocou 2 argumentos e 1 especificador de formato.

 

5 horas atrás, mauricioqueiroz93 disse:

char lixo[10];
do{
    fgets(lixo, 10, stdin);        
}while (!feof(stdin) && lixo[strlen(lixo)-1]!='\n');

O que sobra de uma leitura não é lixo, então você não tem que limpar nada, tem que consumir o que resta no fluxo, e é o que você está fazendo com fgets().

Você pode usar fgetc() e ler caractere por caractere até encontrar um '\n' ou EOF:

int ch;
while((ch = fgetc(stdin)) != '\n' && ch != EOF);

 

5 horas atrás, mauricioqueiroz93 disse:

lerstring(listaNomes[i],30); 

Se quer usar num loop ou coisa assim, inicialize o índice ´i´ antes.

  • Curtir 2
  • Obrigado 1
Postado

scanf() lê entrada (formatada). Só isso. scanf() não anula nada.

 

Pode dar certo como está fazendo, mas não está bom. Não misture scanf() e fgets() porque só vai ter problemas, como de fato já está tendo...

 

.

Quanto à essa função

 

void lerstring(char str[], int max)
{
     fgets(str, max, stdin);
    if (str[strlen(str)-1]=='\n')
        str[strlen(str)-1] = '\0';
    else
    {
        char lixo[10];
        do{
            fgets(lixo, 10, stdin);        
        }while (!feof(stdin) && lixo[strlen(lixo)-1]!='\n');
    } 
}

 

Minha falha, mas não entendo o propósito de ter uma função que lê uma string. Não é esse o propósito de fgets()?

 

E a função está longe de funcionar, com ou sem scanf()

  • trate o retorno de fgets(). SEMPRE. Leia o manual. Se fgets() não ler nada str vai ficar igualzinho e como não testa o retorno NUNCA vai saber. Se você viu isso em uma aula temo que tenha um instrutor ruim. Programas assim ficam em loop aos milhares pelo mundo :)
  • se a entrada tiver exatamenre os max caracteres não vai ter um ´\n´ no fim e seu programa vai morrer. Não testou isso? lixo é local então vai ler e descartar. Qual o sentido?
  • E se ler exatamente 10 não vai ter ´\n´ no fim. Não que faça diferença porque vai sumir de todo modo
  • quase sempre é melhor chamar a função em um loop do que ter um loop dentro da função
  • RETORNE ALGO. void é desperdício.

Sobre main()

 

 

  • TESTE sempre o retorno de scanf()
  • leia o manual
  • O último printf() está errado

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!