Jump to content
Fórum Script Brasil
  • 0

DÚVIDA: printf e scanf junto com \n


Marcus Pimentel Marques
 Share

Question

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.

Edited by Marcus Pimentel Marques
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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) 

Edited by Marcus Pimentel Marques
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.1k
×
×
  • Create New...