Sprawdzanie poprawności wpisania daty

Sprawdzanie poprawności wpisania daty
HipolitZabujca
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 6 lat
  • Postów:42
0

Witam. Funkcja ma zwrócić:
true, gdy data jest wpisana poprawnie, czyli według formatu rrrr-mm-dd
false, wiadomo

Zmienna data jest tablicą znaków.

Kopiuj
bool SprawdzDate(){
	int dl_daty=strlen(data);
	if(dl_daty!=10)	
		return false; 
		
	int i;
	for(i=0; i<10; i++){
		if((i==4)||(i==7))
			if(data[i]!='-')
				return false;
		else{
			if((=data[i]<'0')||(data[i]>'9'))
				return false;
		}
	}
	
	return true;
	
} 

W funkcji brak argumentów, ponieważ zmienne są globalne. Z resztą chodzi mi tylko o poprawność kodu funkcji.

edytowany 1x, ostatnio: HipolitZabujca
PR
  • Rejestracja:około 11 lat
  • Ostatnio:około 14 godzin
  • Lokalizacja:Pomorskie (Stare Kabaty)
0

tak na oko poprawiłem (klamerek brakowało, bo ten else liczył się do drugiego ifa, nie pierwszego jak myślałeś, zresztą kompilator powinien ostrzec o tym)

Kopiuj
bool SprawdzDate(){
    int dl_daty=strlen(data);
    if(dl_daty!=10)    
        return false; 
    
    int i;
    for(i=0; i<10; i++){
        if((i==4)||(i==7)) {
            if(data[i]!='-')
                return false;
        }
        else {
            if((data[i]<'0')||(data[i]>'9'))
                return false;
        }
    }
 
    return true;
 
} 
edytowany 2x, ostatnio: Proxima
PR
pisałem że tylko klamerki, a reszta kodu to już jego cyrk ; )
_13th_Dragon
Ale ten kod widzę (i podejrzewam że nie tylko ja) pod twoim imieniem.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

Przecież kompilator wyraźnie się burzy.
Więc nie rozumiem na co liczysz, że nagle okaże się ze twój kod jest prawidłowy zaś kompilator kłamie?
Poza tym to nie jest sprawdzanie daty, to twoje sprawdzanie (po naprawieniu bzdur oczywiście) powie że data 2015-99-99 jest poprawna natomiast 2016-1-1 już nie.
Nie używaj zmiennych globalnych.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
1

Do klasyfikowania znaków służą funkcje z ctype.h: np. isdigit w tym wypadku. Dodatkowo strlen w sumie nie jest potrzebne bo można po prostu sprawdzać w pętli znaki, ale to mniej ważne. Poza tym nazwy są złe (ekstremalnie ważne), postinkrementacja i jest niefajna (mniej ważne) i formatowanie jest okropne (ekstremalnie ważne).

Ten kod nie do końca sprawdza poprawność daty bo nie sprawdza czy wpisane liczby mają sens.


"(...) otherwise, the behavior is undefined".
edytowany 2x, ostatnio: Endrju
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0
Endrju napisał(a):

... isdigit w tym wypadku ...
Tylko is uwielbienia k zaprzeczeniom ...
return sscanf(data,"%d-%d-%d%c",&x,&x,&x,&x)==3; ;P


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.