Wątek przeniesiony 2016-03-10 11:37 z C/C++ przez ŁF.

Inny wynik niż powinien

0

Witajcie. Dopiero ucze się jezyka C od 2-3 dni. Dziś próbowalem napisać program, wszystko szło nawet ok dopóki nie dochodzi do podania wyniku. Program ma dodawać i odejmować dwie liczby, używając switcha :

[code]
#include <stdio.h>
#include <stdlib.h>

int main()
{
unsigned int a, b, c;

  char znak;
  printf("podaj liczbe a\n");
  scanf ("%d", &a);
  printf("podaj liczbe b\n");
  scanf ("%d", &b);

  printf("Dodajemy (d) czy odejmujemy (m)?\n");
  scanf ("%s", &znak);
        switch (znak)

      {
      case 100://d
      c=a+b;
           printf ("wynik dodawania wynosi %d\n", c);
      break;
      case 109://m
    c=b-a;
           printf ("wynik odejmowania wynosi %d\n", c );
      break;
      default: printf ("zle podane!");
      break;
    }
    fflush (stdin);
  return 0;
}

[code]
Niestety liczbą wynikową jest zmienna a. Czego nie widzę?

0

tak nawiasem to dla unsigned powinno sie stosowac %u.
zaraz zobacze czemu wynik jest zły ;)

1
  1. zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Nie używaj magicznych liczb zamiast: case 100://d napisz po ludzku case 'd':
  3. scanf(" %c",&znak); - spacja bardzo istotna
0

Smoku, możesz wyjaśnić co dokładniej się dzieje?
Dlaczego wartosc dla scanf %c jest pobierana 'automatycznie' jeżeli nie ma spacji?

0

scanf(" %c",&znak); - poprawiłem, działa. Ale prosiłbym o wytłumaczenie.

0
WojekSier napisał(a):

scanf(" %c",&znak); - poprawiłem, działa. Ale prosiłbym o wytłumaczenie.
Jeżeli w dokumentacji dla ciebie nie wystarczająco jasne napisano - to programowanie zwyczajnie nie twoja bajka.

1

czyli jezeli nie ma spacji to scanf czyta znak biały- czyli znak nowej linii, który pozostawiłeś wprowdzając poprzednią wartość.
Jeżeli jest spacja, to znak nie zostaje wczytany i wszystko działa poprawnie.

0
#include <stdio.h>
#include <stdlib.h>

int main()
{
      int a, b, c;
      char znak, d, m;
      printf("podaj liczbe a:\n");
      scanf ("%d", &a);
      printf("podaj liczbe b:\n");
      scanf ("%d", &b);
      fflush(stdin);
      printf("Dodajemy (d) czy odejmujemy (m)?\n");
      scanf("%c", &znak);
          switch(znak)
          {
          case 'd':
              {
                c = a+b;
                printf ("wynik dodawania wynosi: %d\n", c);
                break;
              }
          case 'm':
              {
                c = a-b;
                printf ("wynik odejmowania wynosi: %d\n", c);
                break;
              }
          default:
              {
                printf ("zle podane!\n");
                break;
              }
          }
    fflush (stdin);
    return 0;
}
1

@WojekSier

Wyjaśnienie:

Because most conversion specifiers first consume all consecutive whitespace, code such as

std::scanf("%d", &a);
std::scanf("%d", &b);

will read two integers that are entered on different lines (second %d will consume the newline left over by the first) or on the same line, separated by spaces or tabs (second %d will consume the spaces or tabs).
The conversion specifiers that do not consume leading whitespace, such as %c, can be made to do so by using a whitespace character in the format string:

std::scanf("%d", &a);
std::scanf(" %c", &c); // ignore the endline after %d, then read a char

Cytat za: http://en.cppreference.com/w/cpp/io/c/fscanf#Notes

PS. Kod @Blue_Carpet jest niestety niepoprawny, nie wzoruj się na nim. Nawet, jeśli u niektórych działa (u mnie nie działa).

1 użytkowników online, w tym zalogowanych: 0, gości: 1