Marcus Pimentel Marques Postado Outubro 8, 2015 Denunciar Share Postado Outubro 8, 2015 (editado) 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 COMO O ESTÁA PERCEBAM QUE O PRIMEIRO SCANF ("%c", &sinal); não funcionou. O CÓDIGOPercebam que o primeiro scanf do SINAL NÃO FUNCIONOU. Editado Outubro 8, 2015 por Marcus Pimentel Marques Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 vangodp Postado Outubro 9, 2015 Denunciar Share Postado Outubro 9, 2015 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:Escreva uma letra:Recebi: d_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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcus Pimentel Marques Postado Outubro 9, 2015 Autor Denunciar Share Postado Outubro 9, 2015 (editado) 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 Outubro 9, 2015 por Marcus Pimentel Marques Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 vangodp Postado Outubro 9, 2015 Denunciar Share Postado Outubro 9, 2015 #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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Marcus Pimentel Marques
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
COMO O ESTÁ
A
PERCEBAM QUE O PRIMEIRO SCANF ("%c", &sinal); não funcionou.
O CÓDIGO
Percebam que o primeiro scanf do SINAL NÃO FUNCIONOU.
Editado por Marcus Pimentel MarquesLink para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
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.