Ir ao conteúdo
  • Cadastre-se

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


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

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

 

Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

  • Solução

@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
Link para o comentário
Compartilhar em outros sites

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