Ir ao conteúdo
  • Cadastre-se

C Sequência ordenada em C


Eduardo_Braz

Posts recomendados

Olá

 

Espero que tenha progredido com o programa

 

Vou te mostrar um exemplo aqui que pode ajudar a entender o comportamento de scanf(). Essa função, como o nome diz, tem essa característica de "scan" e é um inferno muitas vezes porque é usada com um propósito diferente, E ela come caracteres, dá problemas com fim de linha e não retorna e tal

 

Exemplo: Como no seu programa, ler dois números, mas de um modo civilizado E usando scanf().

 

Em muitos casos se lê a linha todinha como string e trata no programa, mas mudar a técnica não é exatamente uma solução então vou te mostrar uma possibilidade mantendo scanf().

 

O que se pode fazer é ler o primeiro número, um caracter, o segundo número e outro caracter. Assim scanf() consome o que tiver no caminho e você pode testar o que tinha lá.

 

Por simplicidade vamos chamar os dois char de meio e fim e ler assim

 

    n = scanf("%lf%c%lf%c", &valor1, &meio, &valor2, &fim);

 

Note que scanf() devolve o número de ítens lidos e esperamos claro ler 4.

 

Teste 1

Entre com os dois valores separados por espaco ou TAB . Tecle ENTER ao terminar

Valores: 1a2.1y
scanf() leu 4 itens
scanf()     valor1 = 1.000000
no meio veio algo com codigo 97 = 'a'
scanf()     valor2 = 2.100000
no final veio algo com codigo 121 = 'y'

scanf() foi escrita com esse propósito, scan, e ela então le o 'a' como separador meio e o y como separador fim e pega os valores certinho

 

Teste 2

Entre com os dois valores separados por espaco ou TAB . Tecle ENTER ao terminar

Valores: 1.23   -2.8
scanf() leu 4 itens
scanf()     valor1 = 1.230000
no meio foi um TAB
scanf()     valor2 = -2.800000
no final foi um fim de linha \n

Esse mais parecido com o seu problema, usei 1.23 depois um TAB e o -2.8 e teclei ENTER. 

scanf() leu o meio como TAB e o final como \n como esperado

 

Teste 3

Entre com os dois valores separados por espaco ou TAB . Tecle ENTER ao terminar

Valores: -1,-2
scanf() leu 4 itens
scanf()     valor1 = -1.000000
no meio veio algo com codigo 44 = ','
scanf()     valor2 = -2.000000
no final foi um fim de linha \n

Esse caso é legal: você pode separar os valores por vírgula e teclar ENTER no fim e lê certinho

 

Espero que tenha ajudado a entender.

 

Eis o programa. Rode em sua maquina e pense nisso. Essa função é legal mas o comportamento dela em geral não é explicado direito: o lado scan de scanf(). Minha opinião claro. 

 

Espero que ajude mais do que o que eu te expliquei ontem :D

 

O Programa

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"

int main(int artgc, char** argv)
{
    int            n;
    char        meio, fim;            // os dois delimitadores
    double        valor1, valor2;     // os dois numeros

    printf("Entre com os dois valores separados por espaco ou TAB . Tecle ENTER ao terminar\n");
    printf("\nValores: ");

    n = scanf("%lf%c%lf%c", &valor1, &meio, &valor2, &fim);

    // o que leu?
    printf("scanf() leu %d itens\n", n);

    // o primeiro
    printf("scanf()     valor1 = %lf\n", valor1);

    // o que tinha entre oa dois
    switch (meio)
    {
    case '\t':
        printf("no meio foi um TAB\n");
        break;
    case ' ':
        printf("no meio foi um espaco\n");
        break;
    default:
        printf("no meio veio algo com codigo %d = '%c'\n", meio, meio);
        break;
    }    // switch

    // o segundo
    printf("scanf()     valor2 = %lf\n", valor2);

    // como terminou
    switch (fim)
    {
    case EOF:
        printf("fim de arquivo no final\n");
        break;
    case '\t':
        printf("no final foi um TAB\n");
        break;
    case '\n':
        printf("no final foi um fim de linha \\n \n");
        break;
    case ' ':
        printf("no final foi um espaco\n");
        break;
    default:
        printf("no final veio algo com codigo %d = '%c'\n", fim, fim);
        break;
    }    // switch
}    // main

 

 

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

14 minutos atrás, Eduardo_Braz disse:

@arfneto Muito Obrigado

 

Entendeu o comportamento da função? Alguns autores dizem que ela "consome" a entrada em busca do que está tentando ler e nesse caminho ela pode descartar  coisas como linhas inteiras e espaços em branco. Ou deixa o usuário teclando ENTER a vida inteira e não retorna...

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