• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C Scan f - sprawdzenie czy wpisana wartość jest liczbą czy innym znakiem

Object Storage Arubacloud
0 głosów
673 wizyt
pytanie zadane 18 czerwca 2019 w C i C++ przez boniek Nowicjusz (190 p.)
edycja 19 czerwca 2019 przez Eryk Andrzejewski

Potrzebuję funkcji która sprawdzi mi czy podana wartość jest liczbą i innym znakiem, znalazłem taki kod 

#include <stdio.h>

int main(){

   double a;
   int retVal;
   char ch;

   printf("Podaj liczbe a:");
   retVal = scanf("%lf", &a);

   while (retVal != 1)
   {
      while((ch = getchar()) != '\n' && ch != EOF);
      printf("Podaj liczbę a ponownie:");
      retVal = scanf("%lf", &a);
   }

   return 0;
}

Ten kod jest prawidłowy, działa tak jak powinien. Mam tylko problem z zrozumieniem warunku

while((ch = getchar()) != '\n' && ch != EOF);

Czy ktoś mógłby mi go wytłumaczyć ? Z góry dziękuję za pomoc

komentarz 19 czerwca 2019 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Taka porada - wrzucając kod w bloczek, warto też ustawić mu odpowiedni język programowania - wtedy składnia będzie poprawnie kolorowana. smiley

1 odpowiedź

+1 głos
odpowiedź 19 czerwca 2019 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Trzeba ten warunek rozbić na mniejsze fragmenty. Kluczowym elementem, który trzeba zrozumieć jest to, jak zachowuje się przypisanie wewnątrz warunku.

Masz tam taki kod:

ch = getchar()

Jak nietrudno się domyślić, przypisuje on do zmiennej  ch  to, co zwróci funkcja getchar(). Lecz teraz trzeba sobie zadać pytanie - co taki zapis robi w warunku i jak on się tam zachowuje. Można je sformułować inaczej - jaką wartość zwraca poniższy kod: (czyli jaka wartość zostanie "podstawiona" w to miejsce w momencie wykonania kodu).

(ch = getchar())

Odpowiedź jest prosta - w to miejsce zostanie podstawiona nowa wartość zmiennej ch, czyli ta wartość którą zwróciła funkcja getchar().

Dysponując już taką wiedzą, można zrozumieć o co chodzi w tym zapisie. Po prostu w jednym miejscu zapisujemy do zmiennej ch nową wartość i sprawdzamy, czy wartość ta nie jest przypadkiem różna od znaku nowej linii i tak dalej… całego warunku już nie będę tłumaczył. Kod ten pozwala po prostu skrócić zapis (choć może to komplikować zrozumienie kodu - ja osobiście starałbym się takich rzeczy wewnątrz warunku nie robić).

Dodatkowo za pętlą dano średnik, co jest równoznaczne z tym, że ta pętla ma nie robić nic, dopóki znak jest różny od znaku nowej linii lub EOF.

Jeżeli jestem jeszcze w stanie rozsądnie myśleć o tej godzinie, to alternatywny zapis tej pętli będzie taki:

do {
    ch = getchar();
} while (ch != '\n' && ch != EOF);

Mam nadzieję, że pomogłem. smiley

komentarz 19 czerwca 2019 przez boniek Nowicjusz (190 p.)
Dzięki wielkie, teraz już wiem :)
komentarz 19 czerwca 2019 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Cieszę się. smiley

Podobne pytania

0 głosów
1 odpowiedź 440 wizyt
+2 głosów
3 odpowiedzi 724 wizyt
0 głosów
1 odpowiedź 444 wizyt
pytanie zadane 18 listopada 2022 w C i C++ przez natalia2002. Początkujący (390 p.)

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,953 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...