Ir para conteúdo
Fórum Script Brasil
  • 0

DÚVIDA: printf e scanf junto com \n


Marcus Pimentel Marques

Pergunta

Galera, tenho uma dúvida na quebra de linha junto com scanf e printf.

eu quero que fique assim 

SINAL: __

COEFICIENTE: ___

E ASSIM SUCESSIVAMENTE DENTRO DO LOOP. 

 

Desde já, agradeço.

COMO EU QUERO 

ComoEuQuero.jpg

COMO O  ESTÁ

AConsole.jpg

 PERCEBAM QUE O PRIMEIRO SCANF ("%c", &sinal); não funcionou. 

O CÓDIGO

TelaCodigo.jpg

Percebam que o primeiro scanf do SINAL NÃO FUNCIONOU.

Editado por Marcus Pimentel Marques
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

vamos pensar um pouco com a cabeça, o que você esta tentando é um pouco LOL XD. Não posso ver sua função sinal pois não sei qual o valor de retorno, porem não faz falta, preste atenção no que te vou explicar.

A função scanf espera sempre 1 ou mais parâmetros, sendo o primeiro sempre um const char* que serve para que scanf saiba como tem que tratar os seguintes parâmetros. Nos seguintes parâmetros scanf espera a direção de memoria onde ela tem que enviar os dados, eles serão tratados conforme indicamos no primeiro parâmetro. Até aí nada novo baixo al sol, porem o que nos interessa é o comportamento dessas 2 funções trabalhando juntas, não vou negar que possa ter alguma utilidade, porem é um pouco sem sentido o que você tenta fazer, agora vamos nos focar sobre seus comportamentos.

Quero que você execute esse código a continuação:

#include <stdio.h>

char* foo(char *c){
    printf("\nrecebi: %c\n\n", *c);
    return c;
}

int main() {
    char c = 'd';
    
    printf("Escreva uma letra: ");
    scanf("%c", foo( &c ) );
    
    printf("%c", c);
    getchar();
    return 0;
}

 

Si você executou o código sem "erros" >_<, você vai ver algo como:

  1. Escreva uma letra:
  2. Recebi: d
  3. _

Passamos a analisar o que aconteceu detalhadamente para entender o que acontece.
Dentro da função main justo na linha 11 pedimos un texto, logo depois usamos scanf, scanf esta esperando un char conforme indicamos com nosso const char* "%c", ele espera a direção de memoria onde enviar o char que recebeu do stdin(entrada padrão), aqui nesse ponto não compreendo sua lógica, pois não sei si o que você esta esperando é enviar o que recebeu para a função para algum processo de validação ou sei lá o que você quer fazer dentro de sinal(), lembre-se de sempre adjuntar seu código pois não podemos adivinhar o que você quer por mais obvio que pareça. Continuando... Agora estamos no ponto critico, como falei não sei o que você espera fazer, porem eu te vou explicar o que realmente acontece, logo você saque suas conclusões. Si você pensava que podia enviar o que você recebeu para sinal() você está se enganando, isso não é possível, e agora eu vou lhe demostrar.
Si você observar minuciosamente o resultado que obteve depois de executar meu código você pode se dar conta da ordem em que acontecem os sucessos. E a ordem de sucessos é essa:
Declaro um char e inicializo ele com uma letra 'd' na linha 9;
Na linha 11 o programa pede que se escreva uma letra:
Na seguinte linha 12 chamamos scanf com a intenção de ler um char, e eu ainda esperava enviar esse char para a função foo, porem não se comportou como eu queria.
Em vez de enviar o que eu recebi de scanf direto para a função foo(), o que foi enviado para essa função foi a letra inicial 'd' que lhe resignei a variável c, pois si você já percebeu, dentro da função aparece "recebi: d", antes de que possa ler, ou seja que a função foo() se executa antes de scanf, e por esse motivo é meio que inútil esse enunciado.

Agora temos que se fazer a pergunta... Então onde vai parar a letra que eu entrei por teclado? Porque no final sim que sai corretamente imprimido no printf da linha 14, a resposta a essa pergunta é simples. A função scanf sobrescreve a variável retornada pela função foo()! Em outras palavra o que acontece é justo :

    foo( &c );
    scanf("%c", &c );


Esse é o resultado que você obtêm de fazer :

scanf("%c", foo( &c ) );

 

Pode que não seja o que você queria, de fato eu tentava enviar o que leiamos para a função mas não faz sentido, si faço como você fez scanf espera primeiro que aconteça tudo o que vai acontecer e aguarda que essa função retorne um ponteiro char*, prove modificar o tipo de retorno de char* a char a essa função foo() e você verá o programa falhar, já que ele espera a direção de memoria de uma variável e isso é justo o que faz char* foo();, retorna &c, por isso tudo isso funciona tal como te demostrei. Si tentar mudar char foo() a char* foo() é como si fizera:

 scanf("%c", c );

...Quando o correto seria:

 scanf("%c", &c );

 

Sendo assim a função sempre deveria retornar um ponteiro ou se produziria um erro.

Então isso que você quer fazer é impossível, ou ao menos desconheço um sistema de fazer isso corretamente.

Te vou dar uma possível solução:
 

#include <stdio.h>

void scanfoo(const char *formato, char * p1 ){
    //fazer chequeos necesarios
    //if ( *p1 == 'a' ){
    scanf("%c", p1); //quando estiver seguro que o valor é o que queremos asignamos a nossa variavel.
    
    //else outracoisa
}

int main() {
    char c = 'd';
    
    printf("Escreva uma letra: ");
    scanfoo("%c", &c );
    
    printf("%c", c);
    getchar();
    return 0;
}

 

Espero que tenha entendido. Si quiser deixar o código e explicar melhor o que você quer fazer talvez posso lhe ajudar.

Sorte!

 

 

 

 

 

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

OBRIGADO""

É que eu estou criando um Alg. que resolve derivada de polinômios.

+2x^3 - 2x^1 + (3*x^0) 

Pedi o grau ao usuário e com essa int grau eu criei vetores com a quantidade de índices dada pelo grau sinal[grau] e os outros elementos do monômio. 

Dentro de um Loop eu vou preencher os índices de acordo com o grau do monômio. Depois quero imprimir essas informações que recebi, em outro loop, mas já deu ruim aqui e eu não estou conseguindo. 

#include <stdio.h>

int main (){
    int grau;
    printf ("Digite o grau do polinomio: ");
    scanf ("%d", &grau);
    int GrauAntigo = grau;
    float coeficiente[grau];
    int   expoente[grau], ExpNovo[grau];
    char  sinal[grau];

    while (grau > 0){
        printf ("\nSINAL: ");
        scanf  ("%s", &sinal[grau]);
        printf ("COEFICIENTE: ");
        scanf  ("%f", &coeficiente[grau]);
        printf ("EXPOENTE: ");
        scanf  ("%d", &expoente[grau]);
        ExpNovo[grau] = coeficiente[grau] -1;
        grau--;
    }

    while (GrauAntigo > 0){
        printf ("%s", sinal[GrauAntigo]);
        printf ("%f", coeficiente[GrauAntigo]);
        printf ("%d", expoente[GrauAntigo]);
        printf ("%d\n", ExpNovo[GrauAntigo]);
        GrauAntigo--;
    }

system ("pause");
return 0;
}

Tá dando erro no Segundo Loop.

Sou novo em programação e na Linguagem C 

Meu prof disse que o %c estava lendo o ENTER. 

É A PRIMEIRA VEZ QUE ENTRO EM UM FÓRUM - 

O CARINHA RESOLVEU O MEU PROBLEMA 

MUITO OBRIGADO (Y) 

Editado por Marcus Pimentel Marques
Link para o comentário
Compartilhar em outros sites

  • 0
#include <stdio.h>

int main (){
    int grau;
    printf ("Digite o grau do polinomio: ");
    scanf ("%d", &grau);
    int GrauAntigo = grau;
    float coeficiente[grau];
    int   expoente[grau], ExpNovo[grau];
    char  sinal[grau];

    while (grau > 0){
        printf ("\nSINAL: ");
        scanf  ("%[^\n]%*c", &sinal[grau]);
        printf ("COEFICIENTE: ");
        scanf  ("%f%*c", &coeficiente[grau]);
        printf ("EXPOENTE: ");
        scanf  ("%d%*c", &expoente[grau]);
        ExpNovo[grau] = coeficiente[grau] -1;
        grau--;
    }

    while (GrauAntigo > 0){
        printf ("%s", sinal[GrauAntigo]);
        printf ("%f", coeficiente[GrauAntigo]);
        printf ("%d", expoente[GrauAntigo]);
        printf ("%d\n", ExpNovo[GrauAntigo]);
        GrauAntigo--;
    }

system ("pause");
return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...