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

Zabezpieczenie programu przed wpisywanie liter zamiast liczb

Object Storage Arubacloud
0 głosów
3,119 wizyt
pytanie zadane 21 października 2016 w C i C++ przez zetnix Nowicjusz (140 p.)
edycja 21 października 2016 przez zetnix

Witam serdecznie,
napisałem program do obliczania miejsc zerowych funkcji kwadratowych, lecz nie mogę poradzić sobie do końca z zabezpieczeniem go przed wpisywaniem liter do zmiennych. Chciałbym aby program pytał jeszcze raz o zmienną gdy podam mu jakiś ciąg liter i cyfr.  Gdy podaje mu współczynnik A "22qwe" to wpisuje 22 do zmiennej A zamiast poprosić o ponowne wpisanie. Program działa jednak prawidłowo gdy podam mu najpierw litery, np "qwe22" lub same litery. Co należy zrobić by program działał poprawnie?

To początek kodu:
 


#include <stdio.h>
#include <math.h>
int main()
{

double a, b, c, a1, b1, c1;
while(a1==0)
{
printf("Podaj a:\n");
a1=scanf("%lf",&a);
int k;
         while((k = getchar()) != '\n');
}

 

komentarz 21 października 2016 przez Szahid Pasjonat (20,930 p.)
Może być rozwiązanie używające obiektu cin ?
komentarz 21 października 2016 przez zetnix Nowicjusz (140 p.)
Jeśli będzie działać to jak najbardziej. Cin to nie c++?
komentarz 21 października 2016 przez Szahid Pasjonat (20,930 p.)
Owszem. C++
komentarz 21 października 2016 przez zetnix Nowicjusz (140 p.)
Niestety program muszę napisać w języku C.
komentarz 21 października 2016 przez DragonCoder Nałogowiec (36,500 p.)
Idea, uzyj petli case, lub if, i zamiast int uzyj char, jrzeli jest zle to wykonaj program od nowa i tyle....

2 odpowiedzi

+1 głos
odpowiedź 21 października 2016 przez Szahid Pasjonat (20,930 p.)

Pokaże Ci przykładowy kod tego jak zabezpieczyć zmienne i w komentarzach będę tłumaczył co w danym momencie się dzieje. Do wczytania stosuje obiekt cin ponieważ on posiada flago błędu czyli takie coś co pozwala się zorientować kiedy zostały wpisane niepoprawne dane.

 

#include<iostream>
using namespace std;



int main()
{

   int a; // jakas zmienna typu int

   cin>>a; //wczytanie ją  za pomocą obiektu cin


   while (cin.fail()) //pentla bedzie wykonywala sie dopuki zostana wprowadzone poprawne dane
   {
       cout<<"Podales wartosc nieliczbowa. "<<endl;
       cin.clear(); //metoda ustawia flagi bledu na wartosci początkowe
       cin.sync(); //metoda czysci bufor wejscia

       cout<<"Podaj poprawna wartosc"<<endl;
       cin>>a;

   }


    return 0;
}

 

komentarz 21 października 2016 przez Szahid Pasjonat (20,930 p.)
Pospieszyłem się troche.
komentarz 21 października 2016 przez unknown Nałogowiec (39,560 p.)
Nie ma żadnej gwarancji, że sync wyczyści bufor. A tak poza tym autorowi chodziło o C a nie o C++.
komentarz 21 października 2016 przez Szahid Pasjonat (20,930 p.)
Wiem dlatego napisałem że się pośpieszyłem.  Dlaczego nie ma pewności że sync go wyczyści ?
2
komentarz 21 października 2016 przez unknown Nałogowiec (39,560 p.)
Bo działanie sync jest zależne od implementacji i sync nie służy do czyszczenia bufora wejścia. Do tego służy metoda ignore.
0 głosów
odpowiedź 21 października 2016 przez unknown Nałogowiec (39,560 p.)
komentarz 21 października 2016 przez zetnix Nowicjusz (140 p.)
Próbowałem tego, działa dokładnie tak samo jak mój. Przy wpisaniu np cyfry a potem litery przypisuje te cyfrę do zmiennej co jest błędem.
komentarz 21 października 2016 przez unknown Nałogowiec (39,560 p.)
Wczytuj liczbę jako ciąg znaków. Jeśli znajdziesz jakiś znak który nie będzie cyfrą to ponów wczytywanie a jeśli dane wejściowe będą poprawne rzutuj na double i zapisz do jakiejś zmiennej.
komentarz 21 października 2016 przez zetnix Nowicjusz (140 p.)
Dzięki za pomoc, lecz czy mógłbyś proszę podać jakiś przykład jak to powinno wyglądać?
komentarz 21 października 2016 przez unknown Nałogowiec (39,560 p.)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 16

int check(char* str){
  int i;
  for(i=0; str[i]!='\0'; ++i){
    if((str[i] >= '0' && str[i] <= '9') || str[i] == '.');
    else return 0;
  }
  return 1;
}

int main(){
  char str[SIZE];
  double val;
  fgets(str, SIZE, stdin);
  str[strlen(str)-1]='\0';
  if(check(str))
    val=strtod(str, NULL);
  printf("%f\n", val);
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,647 wizyt
0 głosów
1 odpowiedź 424 wizyt
0 głosów
2 odpowiedzi 2,234 wizyt

92,620 zapytań

141,474 odpowiedzi

319,815 komentarzy

62,005 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!

...