Jump to content

O printf/scanf não aceita mais que uma palavra!?


Sofia-Fonseca
 Share

Go to solution Solved by Sofia-Fonseca,

Recommended Posts

Olá pessoal,

sou iniciante e autodidacta, preciso de saber como fazer correr o seguinte trecho de código:

#include <stdio.h>
#include <conio.h>

main()
{
      char nome[30];
      float compra, desconto, total_compra;
      
      printf("Qual é o seu nome? ");
      scanf("%s", &nome);
      printf("Qual é o valor da sua compra? ");
      scanf("%f", &compra);
      
      if (compra<=200)
        desconto=(compra*10)/100;
      else if (compra<=500)
        desconto=(compra*15)/100;
      else 
        desconto=(compra*20)/100;
        
      total_compra=compra-desconto;
      printf("Cliente: %s\nTotal: %f\nDesconto: %f\nA pagar: %f ", nome, compra, desconto, total_compra);
      
      printf("\nObrigado e volte sempre!");
      
      getch();
      
      }
 

em que a resposta dada seja em mais que uma palavra pois se colocar duas palavras na resposta o programa dá erro:

http://img252.imageshack.us/img252/5740/capturarap.png

Se colocar só uma palavra já corre sem problemas:

http://img820.imageshack.us/img820/3077/capturardi.png

Obrigada a todos os que lerem isto e principalmente a quem me puder responder.  👍

Link to comment
Share on other sites

Ja vi que resolveste o problema.

Mas nao posso deixar de passar a oportunidade para te dar umas sugestoes 👍

1) usa double em vez de float.

Obviamente que tens que alterar o formato no scanf() (para "%lf").

2) Limita o numero de caracters lidos no primeiro scanf (como sugerido no post com a resposta)

scanf("%29[^\n]", nome);

3) nome e &nome sao coisas diferentes (tal como 42 elefantes e 42 pulgas sao coisas diferentes, embora tenham o mesmo valor). O tipo de nome como parametro na funcao scanf() é char *; o tipo de &nome é char (*)[30].

4) Se conseguires nao usar as funcoes declaradas no header <conio.h> o teu programa pode ser compilado em muitos mais computadores. No teu caso especifico, a unica funcao que usas é getch(). Podes substitui-la por getchar() que esta declarada no header <stdio.h>.

5) Aumenta o nivel de "warnings" do teu compilador para o maximo possivel e tenta fazer compilacoes limpas.

No teu caso isso implicaria adicionar o tipo de retorno a funcao main() e/ou adicionar uma instrucao de "return 0;" antes do ultimo }[/code]

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Ja vi que resolveste o problema.

Mas nao posso deixar de passar a oportunidade para te dar umas sugestoes 👍

E eu agradeço!

1) usa double em vez de float.

Obviamente que tens que alterar o formato no scanf() (para "%lf").

Ok, já fiz! Mas qual é a diferença?

2) Limita o numero de caracters lidos no primeiro scanf (como sugerido no post com a resposta)

scanf("%29[^\n]", nome);

Ok, entendi.

3) nome e &nome sao coisas diferentes (tal como 42 elefantes e 42 pulgas sao coisas diferentes, embora tenham o mesmo valor). O tipo de nome como parametro na funcao scanf() é char *; o tipo de &nome é char (*)[30].

Não entendi muito bem mas irei aprofundar.

4) Se conseguires nao usar as funcoes declaradas no header <conio.h> o teu programa pode ser compilado em muitos mais computadores. No teu caso especifico, a unica funcao que usas é getch(). Podes substitui-la por getchar() que esta declarada no header <stdio.h>.

Ok!

5) Aumenta o nivel de "warnings" do teu compilador para o maximo possivel e tenta fazer compilacoes limpas.

No teu caso isso implicaria adicionar o tipo de retorno a funcao main() e/ou adicionar uma instrucao de "return 0;" antes do ultimo }[/code]

Ainda não conheço essa instrução "return 0", mas chegarei lá!

Obrigada pelas dicas preciosas! 😁

Link to comment
Share on other sites

Mas qual é a diferença [entre double e float]?

O compilador esta preparado para tratar com doubles.

Todas as instrucoes aritmeticas de virgula flutuante sao feitas em double (ou long double).

Nao é possivel mandar um float para a funcao printf(); todos eles sao convertidos automagicamente para double antes do printf propriamente dito comecar a funcionar.

Por exemplo, o programa seguinte tem varias conversoes desnecessarias

#include <stdio.h>
int main(void) {
    float valor, resultado;
    valor = 3.14159; /* conversao desnecessaria se valor fosse double */
    resultado = valor * valor; /* primeiro valor é convertido para double
                               ** depois a multiplicacao é feita
                               ** e o valor obtido é convertido para float */
    printf("O quadrado de PI = %f\n", resultado); /* mais uma conversao de float para double */
    return 0;
}

Usa float so se precisares de um array grande de valores, para poupar memoria. Um array de 1000 elementos (na grande maioria dos casos) nao é grande suficiente para justificar o uso de float!! 👍

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Olá pmg,

tenho usado o double em vez de float conforme indicas-te, mas tenho problemas com o getchar.

Por exemplo:

#include <stdio.h>

main()
{
  int A, B, C;
  printf("Digite o valor de A: ");
  scanf("%d", &A);
  printf("Digite o valor de B: ");
  scanf("%d", &B);
  printf("Digite o valor de C: ");
  scanf("%d", &C);

  if ((A<=B) && (A<=C))
     if (B<=C)
         printf("Em ordem crescente ficou: %d - %d - %d", A, C, B);
     else
         printf("Em ordem crescente ficou: %d - %d - %d", A, C, B);
  else if((B<=A) && (B<=C))
     if (A<=C)
         printf("Em ordem crescente ficou: %d - %d - %d", B, A, C);
     else
         printf("Em ordem crescente ficou: %d - %d - %d", B, C, A);

 else if (A<=B)
         printf("Em ordem crescente ficou: %d - %d - %d", C, A, B);
     else
         printf("Em ordem crescente ficou: %d - %d - %d", C, B, A);

  printf("\n\n\n.....FIM.....");
  getchar();
}

Quando corre acontece:

Com getch() após o valor de C faço enter e o resultado fica a tela.

Com getchar() pós o valor de C faço enter e o compilador fecha tudo.

Está a escapar-me alguma coisa?

Obrigada

Link to comment
Share on other sites

O que acontece é o seguinte:

1) tu escreves (em 3 momentos diferentes) "1<ENTER>2<ENTER>3<ENTER>" que é o que fica no buffer

2) o primeiro scanf tira o 1 do buffer e fica lá "<ENTER>2<ENTER>3<ENTER>"

3) o segundo scanf tira o ENTER e o 2 do buffer e fica lá "<ENTER>3<ENTER>"

4) o terceiro scanf tira o ENTER e o 3 do buffer e fica lá "<ENTER>"

Como vês ainda lá está um "<ENTER>" à espera

5) o getchar() (ou getch(): não percebo porque funciona com um e não com outro) tira o ENTER

6) e o programa acaba.

Tens que fazer a gestão dos ENTER de acordo com as tuas necessidades.

Uma "solução" muito usada (mal usada) por muitos programadores de Windows é o fflush(stdin)

fflush(stdin); // A especificação da linguagem C diz especificamente que isto não está definido
               // Em Windows está bem descrito que é válido e definido

A melhor maneira de tratar o input é com fgets() e sscanf() em vez do scanf()

// scanf("%d", &valor);
char tmp[100];
fgets(tmp, sizeof tmp, stdin);
sscanf(tmp, "%d", &valor);

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.