dlaczego tutaj musi być spacja " %c"

0

Witam mam taki program on działa ale nie wiem dlaczego przy wczytywaniu zmiennej d typu char ( scanf(" %c",&d); ) musi być tam spacja mógłby ktoś mi to wyjaśnić ?
Nie interesują mnie odpowiedzi nadaj zmienna jako tablice chce się tylko dowiedzieć dlaczego tam musi być spacja.

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

int main()
{

float a,b,c;
char d;
printf("podaj a:\n");
scanf("%f",&a);
printf("podaj b:\n");
scanf("%f",&b);
printf("podaj znak wyrazenia:\n");
scanf(" %c",&d);
printf("znak rowna sie:%c\n",d);
if(d==('/'))
   {
    c=a/b;
    printf("znak rowna sie:%0.2f\n",c);
   }
if(d==('+'))
   {
    c=a+b;
    printf("znak rowna sie:%0.2f\n",c);
   }
if(d==('-'))
   {
    c=a-b;
    printf("znak rowna sie:%0.2f\n",c);
   }
if(d==('*'))
   {
    c=a*b;
    printf("znak rowna sie:%0.2f\n",c);
   }
if((d!=('*'))&&(d!=('+'))&&(d!=('/'))&&(d!=('-')))
   {
    printf("wybrales zly znak");
   }
return 0;

}

0

Hm, wcale nie musi być spacji. Zamieszczam przykład: http://ideone.com/apIUME.

0

to ciekawe bo jak dodałem float b; i
scanf("%f", &b);
printf("%f\n", b);
przed wczytywaniem char to nie działał a jak po to działał

0

Zdaj porządne pytane! Skąd ja mam wiedzieć na jakiej podstawie wysunąłeś wniosek o spacji?
Napisz dokładnie: co wpisujesz na wejście, co dostajesz do zmiennej, a czego oczekujesz, że masz uzyskać.

Jeszcze jedno użyj tagów <cpp></cpp> do kolorowania składni kodu (albo <code=cpp></code>).

0

Chodzi ogólnie o to, że przy podawaniu argumentów oraz wtedy, gdy naciskasz pomiędzy ich podawaniem klawisz Enter (=return) - to znaczy podajesz programowi znak końca linii \n - to wtedy program sobie odczytuje ten \n jako pierwszy znak, i nie wyświetla właściwego znaku.

Jeśli natomiast wstawisz spację (lub \n lub inny biały znak), to funkcja scanf wtedy zignoruje wszystkie białe znaki aż do pierwszego nie-białego znaku.

Tu zostało to wyjaśnione: http://stackoverflow.com/ques[...]etween-scanfc-c-and-scanf-c-c

EDIT:

Odpowiedź, czemu scanf działa w ten sposób (opis z dokumentacji funkcji fscanf, która działa tak samo, tylko bardziej ogólnie):

"A directive composed of white-space character(s) is executed by reading input up to the first non-white-space character (which remains unread), or until no more characters can be read. The directive never fails."

oraz

"Input white-space characters (as specified by the isspace function) are skipped, unless the specification includes a [, c, or n specifier."

To wyjątek z dokumentacji języka C (http://www.open-std.org/jtc1/sc22/wg14/www/standards LUB http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf).

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